Merge branch 'master' into Bootstrap4
This commit is contained in:
commit
c3e4083e8d
|
@ -27,11 +27,10 @@
|
||||||
"bootstrap-sass": "~3.3.6",
|
"bootstrap-sass": "~3.3.6",
|
||||||
"fontawesome": "~4.5.0",
|
"fontawesome": "~4.5.0",
|
||||||
"_s": "https://github.com/Automattic/_s.git",
|
"_s": "https://github.com/Automattic/_s.git",
|
||||||
"OwlCarousel2": "https://github.com/smashingboxes/OwlCarousel2.git"
|
"OwlCarousel2": "https://github.com/smashingboxes/OwlCarousel2.git",
|
||||||
|
"bootstrap": "v4.0.0-alpha.2"
|
||||||
},
|
},
|
||||||
"_source": "https://github.com/holger1411/understrap.git",
|
"_source": "https://github.com/holger1411/understrap.git",
|
||||||
"_target": "~0.3.8",
|
"_target": "~0.3.8",
|
||||||
"_originalSource": "understrap"
|
"_originalSource": "understrap"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
20
gulpfile.js
20
gulpfile.js
|
@ -58,7 +58,7 @@ gulp.task('cleancss', function() {
|
||||||
gulp.task('scripts', function() {
|
gulp.task('scripts', function() {
|
||||||
gulp.src([
|
gulp.src([
|
||||||
basePaths.dev + 'js/jquery.min.js',
|
basePaths.dev + 'js/jquery.min.js',
|
||||||
basePaths.dev + 'js/bootstrap.min.js',
|
basePaths.dev + 'js/bootstrap3/bootstrap.min.js', //<--------- Change from /bootstrap3 to /bootstrap4 Watch out! just for testing in the moment!
|
||||||
basePaths.dev + 'js/owl.carousel.min.js',
|
basePaths.dev + 'js/owl.carousel.min.js',
|
||||||
basePaths.dev + 'js/skip-link-focus-fix.js'
|
basePaths.dev + 'js/skip-link-focus-fix.js'
|
||||||
])
|
])
|
||||||
|
@ -71,18 +71,32 @@ gulp.task('scripts', function() {
|
||||||
// gulp copy-assets.
|
// gulp copy-assets.
|
||||||
// Copy all needed dependency assets files from bower_component assets to themes /js, /scss and /fonts folder. Run this task after bower install or bower update
|
// Copy all needed dependency assets files from bower_component assets to themes /js, /scss and /fonts folder. Run this task after bower install or bower update
|
||||||
|
|
||||||
|
|
||||||
|
////////////////// All Bootstrap SASS 3 Assets /////////////////////////
|
||||||
// Copy all Bootstrap JS files
|
// Copy all Bootstrap JS files
|
||||||
gulp.task('copy-assets', function() {
|
gulp.task('copy-assets', function() {
|
||||||
gulp.src(basePaths.bower + 'bootstrap-sass/assets/javascripts/**/*.js')
|
gulp.src(basePaths.bower + 'bootstrap-sass/assets/javascripts/**/*.js')
|
||||||
.pipe(gulp.dest(basePaths.dev + '/js'));
|
.pipe(gulp.dest(basePaths.dev + '/js/bootstrap3'));
|
||||||
|
|
||||||
// Copy all Bootstrap SCSS files
|
// Copy all Bootstrap SCSS files
|
||||||
gulp.src(basePaths.bower + 'bootstrap-sass/assets/stylesheets/**/*.scss')
|
gulp.src(basePaths.bower + 'bootstrap-sass/assets/stylesheets/**/*.scss')
|
||||||
.pipe(gulp.dest(basePaths.dev + '/sass/bootstrap-sass'));
|
.pipe(gulp.dest(basePaths.dev + '/sass/bootstrap3'));
|
||||||
|
|
||||||
// Copy all Bootstrap Fonts
|
// Copy all Bootstrap Fonts
|
||||||
gulp.src(basePaths.bower + 'bootstrap-sass/assets/fonts/bootstrap/*.{ttf,woff,woff2,eof,svg}')
|
gulp.src(basePaths.bower + 'bootstrap-sass/assets/fonts/bootstrap/*.{ttf,woff,woff2,eof,svg}')
|
||||||
.pipe(gulp.dest('./fonts'));
|
.pipe(gulp.dest('./fonts'));
|
||||||
|
////////////////// End Bootstrap 3 Assets /////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
////////////////// All Bootstrap 4 Assets /////////////////////////
|
||||||
|
// Copy all Bootstrap JS files
|
||||||
|
gulp.src(basePaths.bower + 'bootstrap/js/**/*.js')
|
||||||
|
.pipe(gulp.dest(basePaths.dev + '/js/bootstrap4'));
|
||||||
|
|
||||||
|
// Copy all Bootstrap SCSS files
|
||||||
|
gulp.src(basePaths.bower + 'bootstrap/scss/**/*.scss')
|
||||||
|
.pipe(gulp.dest(basePaths.dev + '/sass/bootstrap4'));
|
||||||
|
////////////////// End Bootstrap 4 Assets /////////////////////////
|
||||||
|
|
||||||
// Copy all Font Awesome Fonts
|
// Copy all Font Awesome Fonts
|
||||||
gulp.src(basePaths.bower + 'fontawesome/fonts/**/*.{ttf,woff,woff2,eof,svg}')
|
gulp.src(basePaths.bower + 'fontawesome/fonts/**/*.{ttf,woff,woff2,eof,svg}')
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -30,7 +30,7 @@ Import all needed 3rd party sass files plus your own style and variables
|
||||||
|
|
||||||
// @import "../bower_components/_s/sass/style";
|
// @import "../bower_components/_s/sass/style";
|
||||||
@import "theme/theme_variables"; // <--------- Add your variables into this file. Also add variables to overwrite Bootstrap or UnderStrap variables here
|
@import "theme/theme_variables"; // <--------- Add your variables into this file. Also add variables to overwrite Bootstrap or UnderStrap variables here
|
||||||
@import "../src/sass/bootstrap-sass/bootstrap";
|
@import "../src/sass/bootstrap3/bootstrap";// <--------- Change from /bootstrap3 to /bootstrap4 Watch out! just for testing in the moment!
|
||||||
@import "understrap/understrap";
|
@import "understrap/understrap";
|
||||||
@import "../src/sass/fontawesome/font-awesome";
|
@import "../src/sass/fontawesome/font-awesome";
|
||||||
@import "../src/sass/owl-carousel2/owl.carousel";
|
@import "../src/sass/owl-carousel2/owl.carousel";
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,12 @@
|
||||||
|
//= require ./bootstrap/affix
|
||||||
|
//= require ./bootstrap/alert
|
||||||
|
//= require ./bootstrap/button
|
||||||
|
//= require ./bootstrap/carousel
|
||||||
|
//= require ./bootstrap/collapse
|
||||||
|
//= require ./bootstrap/dropdown
|
||||||
|
//= require ./bootstrap/modal
|
||||||
|
//= require ./bootstrap/scrollspy
|
||||||
|
//= require ./bootstrap/tab
|
||||||
|
//= require ./bootstrap/transition
|
||||||
|
//= require ./bootstrap/tooltip
|
||||||
|
//= require ./bootstrap/popover
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,162 @@
|
||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: affix.js v3.3.6
|
||||||
|
* http://getbootstrap.com/javascript/#affix
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// AFFIX CLASS DEFINITION
|
||||||
|
// ======================
|
||||||
|
|
||||||
|
var Affix = function (element, options) {
|
||||||
|
this.options = $.extend({}, Affix.DEFAULTS, options)
|
||||||
|
|
||||||
|
this.$target = $(this.options.target)
|
||||||
|
.on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
|
||||||
|
.on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
|
||||||
|
|
||||||
|
this.$element = $(element)
|
||||||
|
this.affixed = null
|
||||||
|
this.unpin = null
|
||||||
|
this.pinnedOffset = null
|
||||||
|
|
||||||
|
this.checkPosition()
|
||||||
|
}
|
||||||
|
|
||||||
|
Affix.VERSION = '3.3.6'
|
||||||
|
|
||||||
|
Affix.RESET = 'affix affix-top affix-bottom'
|
||||||
|
|
||||||
|
Affix.DEFAULTS = {
|
||||||
|
offset: 0,
|
||||||
|
target: window
|
||||||
|
}
|
||||||
|
|
||||||
|
Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
|
||||||
|
var scrollTop = this.$target.scrollTop()
|
||||||
|
var position = this.$element.offset()
|
||||||
|
var targetHeight = this.$target.height()
|
||||||
|
|
||||||
|
if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
|
||||||
|
|
||||||
|
if (this.affixed == 'bottom') {
|
||||||
|
if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
|
||||||
|
return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
|
||||||
|
}
|
||||||
|
|
||||||
|
var initializing = this.affixed == null
|
||||||
|
var colliderTop = initializing ? scrollTop : position.top
|
||||||
|
var colliderHeight = initializing ? targetHeight : height
|
||||||
|
|
||||||
|
if (offsetTop != null && scrollTop <= offsetTop) return 'top'
|
||||||
|
if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
Affix.prototype.getPinnedOffset = function () {
|
||||||
|
if (this.pinnedOffset) return this.pinnedOffset
|
||||||
|
this.$element.removeClass(Affix.RESET).addClass('affix')
|
||||||
|
var scrollTop = this.$target.scrollTop()
|
||||||
|
var position = this.$element.offset()
|
||||||
|
return (this.pinnedOffset = position.top - scrollTop)
|
||||||
|
}
|
||||||
|
|
||||||
|
Affix.prototype.checkPositionWithEventLoop = function () {
|
||||||
|
setTimeout($.proxy(this.checkPosition, this), 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
Affix.prototype.checkPosition = function () {
|
||||||
|
if (!this.$element.is(':visible')) return
|
||||||
|
|
||||||
|
var height = this.$element.height()
|
||||||
|
var offset = this.options.offset
|
||||||
|
var offsetTop = offset.top
|
||||||
|
var offsetBottom = offset.bottom
|
||||||
|
var scrollHeight = Math.max($(document).height(), $(document.body).height())
|
||||||
|
|
||||||
|
if (typeof offset != 'object') offsetBottom = offsetTop = offset
|
||||||
|
if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
|
||||||
|
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
|
||||||
|
|
||||||
|
var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
|
||||||
|
|
||||||
|
if (this.affixed != affix) {
|
||||||
|
if (this.unpin != null) this.$element.css('top', '')
|
||||||
|
|
||||||
|
var affixType = 'affix' + (affix ? '-' + affix : '')
|
||||||
|
var e = $.Event(affixType + '.bs.affix')
|
||||||
|
|
||||||
|
this.$element.trigger(e)
|
||||||
|
|
||||||
|
if (e.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
this.affixed = affix
|
||||||
|
this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
|
||||||
|
|
||||||
|
this.$element
|
||||||
|
.removeClass(Affix.RESET)
|
||||||
|
.addClass(affixType)
|
||||||
|
.trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (affix == 'bottom') {
|
||||||
|
this.$element.offset({
|
||||||
|
top: scrollHeight - height - offsetBottom
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// AFFIX PLUGIN DEFINITION
|
||||||
|
// =======================
|
||||||
|
|
||||||
|
function Plugin(option) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var data = $this.data('bs.affix')
|
||||||
|
var options = typeof option == 'object' && option
|
||||||
|
|
||||||
|
if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
|
||||||
|
if (typeof option == 'string') data[option]()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var old = $.fn.affix
|
||||||
|
|
||||||
|
$.fn.affix = Plugin
|
||||||
|
$.fn.affix.Constructor = Affix
|
||||||
|
|
||||||
|
|
||||||
|
// AFFIX NO CONFLICT
|
||||||
|
// =================
|
||||||
|
|
||||||
|
$.fn.affix.noConflict = function () {
|
||||||
|
$.fn.affix = old
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// AFFIX DATA-API
|
||||||
|
// ==============
|
||||||
|
|
||||||
|
$(window).on('load', function () {
|
||||||
|
$('[data-spy="affix"]').each(function () {
|
||||||
|
var $spy = $(this)
|
||||||
|
var data = $spy.data()
|
||||||
|
|
||||||
|
data.offset = data.offset || {}
|
||||||
|
|
||||||
|
if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
|
||||||
|
if (data.offsetTop != null) data.offset.top = data.offsetTop
|
||||||
|
|
||||||
|
Plugin.call($spy, data)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
}(jQuery);
|
|
@ -0,0 +1,94 @@
|
||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: alert.js v3.3.6
|
||||||
|
* http://getbootstrap.com/javascript/#alerts
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// ALERT CLASS DEFINITION
|
||||||
|
// ======================
|
||||||
|
|
||||||
|
var dismiss = '[data-dismiss="alert"]'
|
||||||
|
var Alert = function (el) {
|
||||||
|
$(el).on('click', dismiss, this.close)
|
||||||
|
}
|
||||||
|
|
||||||
|
Alert.VERSION = '3.3.6'
|
||||||
|
|
||||||
|
Alert.TRANSITION_DURATION = 150
|
||||||
|
|
||||||
|
Alert.prototype.close = function (e) {
|
||||||
|
var $this = $(this)
|
||||||
|
var selector = $this.attr('data-target')
|
||||||
|
|
||||||
|
if (!selector) {
|
||||||
|
selector = $this.attr('href')
|
||||||
|
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
|
||||||
|
}
|
||||||
|
|
||||||
|
var $parent = $(selector)
|
||||||
|
|
||||||
|
if (e) e.preventDefault()
|
||||||
|
|
||||||
|
if (!$parent.length) {
|
||||||
|
$parent = $this.closest('.alert')
|
||||||
|
}
|
||||||
|
|
||||||
|
$parent.trigger(e = $.Event('close.bs.alert'))
|
||||||
|
|
||||||
|
if (e.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
$parent.removeClass('in')
|
||||||
|
|
||||||
|
function removeElement() {
|
||||||
|
// detach from parent, fire event then clean up data
|
||||||
|
$parent.detach().trigger('closed.bs.alert').remove()
|
||||||
|
}
|
||||||
|
|
||||||
|
$.support.transition && $parent.hasClass('fade') ?
|
||||||
|
$parent
|
||||||
|
.one('bsTransitionEnd', removeElement)
|
||||||
|
.emulateTransitionEnd(Alert.TRANSITION_DURATION) :
|
||||||
|
removeElement()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ALERT PLUGIN DEFINITION
|
||||||
|
// =======================
|
||||||
|
|
||||||
|
function Plugin(option) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var data = $this.data('bs.alert')
|
||||||
|
|
||||||
|
if (!data) $this.data('bs.alert', (data = new Alert(this)))
|
||||||
|
if (typeof option == 'string') data[option].call($this)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var old = $.fn.alert
|
||||||
|
|
||||||
|
$.fn.alert = Plugin
|
||||||
|
$.fn.alert.Constructor = Alert
|
||||||
|
|
||||||
|
|
||||||
|
// ALERT NO CONFLICT
|
||||||
|
// =================
|
||||||
|
|
||||||
|
$.fn.alert.noConflict = function () {
|
||||||
|
$.fn.alert = old
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ALERT DATA-API
|
||||||
|
// ==============
|
||||||
|
|
||||||
|
$(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
|
||||||
|
|
||||||
|
}(jQuery);
|
|
@ -0,0 +1,120 @@
|
||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: button.js v3.3.6
|
||||||
|
* http://getbootstrap.com/javascript/#buttons
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// BUTTON PUBLIC CLASS DEFINITION
|
||||||
|
// ==============================
|
||||||
|
|
||||||
|
var Button = function (element, options) {
|
||||||
|
this.$element = $(element)
|
||||||
|
this.options = $.extend({}, Button.DEFAULTS, options)
|
||||||
|
this.isLoading = false
|
||||||
|
}
|
||||||
|
|
||||||
|
Button.VERSION = '3.3.6'
|
||||||
|
|
||||||
|
Button.DEFAULTS = {
|
||||||
|
loadingText: 'loading...'
|
||||||
|
}
|
||||||
|
|
||||||
|
Button.prototype.setState = function (state) {
|
||||||
|
var d = 'disabled'
|
||||||
|
var $el = this.$element
|
||||||
|
var val = $el.is('input') ? 'val' : 'html'
|
||||||
|
var data = $el.data()
|
||||||
|
|
||||||
|
state += 'Text'
|
||||||
|
|
||||||
|
if (data.resetText == null) $el.data('resetText', $el[val]())
|
||||||
|
|
||||||
|
// push to event loop to allow forms to submit
|
||||||
|
setTimeout($.proxy(function () {
|
||||||
|
$el[val](data[state] == null ? this.options[state] : data[state])
|
||||||
|
|
||||||
|
if (state == 'loadingText') {
|
||||||
|
this.isLoading = true
|
||||||
|
$el.addClass(d).attr(d, d)
|
||||||
|
} else if (this.isLoading) {
|
||||||
|
this.isLoading = false
|
||||||
|
$el.removeClass(d).removeAttr(d)
|
||||||
|
}
|
||||||
|
}, this), 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
Button.prototype.toggle = function () {
|
||||||
|
var changed = true
|
||||||
|
var $parent = this.$element.closest('[data-toggle="buttons"]')
|
||||||
|
|
||||||
|
if ($parent.length) {
|
||||||
|
var $input = this.$element.find('input')
|
||||||
|
if ($input.prop('type') == 'radio') {
|
||||||
|
if ($input.prop('checked')) changed = false
|
||||||
|
$parent.find('.active').removeClass('active')
|
||||||
|
this.$element.addClass('active')
|
||||||
|
} else if ($input.prop('type') == 'checkbox') {
|
||||||
|
if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
|
||||||
|
this.$element.toggleClass('active')
|
||||||
|
}
|
||||||
|
$input.prop('checked', this.$element.hasClass('active'))
|
||||||
|
if (changed) $input.trigger('change')
|
||||||
|
} else {
|
||||||
|
this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
|
||||||
|
this.$element.toggleClass('active')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// BUTTON PLUGIN DEFINITION
|
||||||
|
// ========================
|
||||||
|
|
||||||
|
function Plugin(option) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var data = $this.data('bs.button')
|
||||||
|
var options = typeof option == 'object' && option
|
||||||
|
|
||||||
|
if (!data) $this.data('bs.button', (data = new Button(this, options)))
|
||||||
|
|
||||||
|
if (option == 'toggle') data.toggle()
|
||||||
|
else if (option) data.setState(option)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var old = $.fn.button
|
||||||
|
|
||||||
|
$.fn.button = Plugin
|
||||||
|
$.fn.button.Constructor = Button
|
||||||
|
|
||||||
|
|
||||||
|
// BUTTON NO CONFLICT
|
||||||
|
// ==================
|
||||||
|
|
||||||
|
$.fn.button.noConflict = function () {
|
||||||
|
$.fn.button = old
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// BUTTON DATA-API
|
||||||
|
// ===============
|
||||||
|
|
||||||
|
$(document)
|
||||||
|
.on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
|
||||||
|
var $btn = $(e.target)
|
||||||
|
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
|
||||||
|
Plugin.call($btn, 'toggle')
|
||||||
|
if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()
|
||||||
|
})
|
||||||
|
.on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
|
||||||
|
$(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
|
||||||
|
})
|
||||||
|
|
||||||
|
}(jQuery);
|
|
@ -0,0 +1,237 @@
|
||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: carousel.js v3.3.6
|
||||||
|
* http://getbootstrap.com/javascript/#carousel
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// CAROUSEL CLASS DEFINITION
|
||||||
|
// =========================
|
||||||
|
|
||||||
|
var Carousel = function (element, options) {
|
||||||
|
this.$element = $(element)
|
||||||
|
this.$indicators = this.$element.find('.carousel-indicators')
|
||||||
|
this.options = options
|
||||||
|
this.paused = null
|
||||||
|
this.sliding = null
|
||||||
|
this.interval = null
|
||||||
|
this.$active = null
|
||||||
|
this.$items = null
|
||||||
|
|
||||||
|
this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
|
||||||
|
|
||||||
|
this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
|
||||||
|
.on('mouseenter.bs.carousel', $.proxy(this.pause, this))
|
||||||
|
.on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
|
||||||
|
}
|
||||||
|
|
||||||
|
Carousel.VERSION = '3.3.6'
|
||||||
|
|
||||||
|
Carousel.TRANSITION_DURATION = 600
|
||||||
|
|
||||||
|
Carousel.DEFAULTS = {
|
||||||
|
interval: 5000,
|
||||||
|
pause: 'hover',
|
||||||
|
wrap: true,
|
||||||
|
keyboard: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Carousel.prototype.keydown = function (e) {
|
||||||
|
if (/input|textarea/i.test(e.target.tagName)) return
|
||||||
|
switch (e.which) {
|
||||||
|
case 37: this.prev(); break
|
||||||
|
case 39: this.next(); break
|
||||||
|
default: return
|
||||||
|
}
|
||||||
|
|
||||||
|
e.preventDefault()
|
||||||
|
}
|
||||||
|
|
||||||
|
Carousel.prototype.cycle = function (e) {
|
||||||
|
e || (this.paused = false)
|
||||||
|
|
||||||
|
this.interval && clearInterval(this.interval)
|
||||||
|
|
||||||
|
this.options.interval
|
||||||
|
&& !this.paused
|
||||||
|
&& (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
Carousel.prototype.getItemIndex = function (item) {
|
||||||
|
this.$items = item.parent().children('.item')
|
||||||
|
return this.$items.index(item || this.$active)
|
||||||
|
}
|
||||||
|
|
||||||
|
Carousel.prototype.getItemForDirection = function (direction, active) {
|
||||||
|
var activeIndex = this.getItemIndex(active)
|
||||||
|
var willWrap = (direction == 'prev' && activeIndex === 0)
|
||||||
|
|| (direction == 'next' && activeIndex == (this.$items.length - 1))
|
||||||
|
if (willWrap && !this.options.wrap) return active
|
||||||
|
var delta = direction == 'prev' ? -1 : 1
|
||||||
|
var itemIndex = (activeIndex + delta) % this.$items.length
|
||||||
|
return this.$items.eq(itemIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
Carousel.prototype.to = function (pos) {
|
||||||
|
var that = this
|
||||||
|
var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
|
||||||
|
|
||||||
|
if (pos > (this.$items.length - 1) || pos < 0) return
|
||||||
|
|
||||||
|
if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
|
||||||
|
if (activeIndex == pos) return this.pause().cycle()
|
||||||
|
|
||||||
|
return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
|
||||||
|
}
|
||||||
|
|
||||||
|
Carousel.prototype.pause = function (e) {
|
||||||
|
e || (this.paused = true)
|
||||||
|
|
||||||
|
if (this.$element.find('.next, .prev').length && $.support.transition) {
|
||||||
|
this.$element.trigger($.support.transition.end)
|
||||||
|
this.cycle(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.interval = clearInterval(this.interval)
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
Carousel.prototype.next = function () {
|
||||||
|
if (this.sliding) return
|
||||||
|
return this.slide('next')
|
||||||
|
}
|
||||||
|
|
||||||
|
Carousel.prototype.prev = function () {
|
||||||
|
if (this.sliding) return
|
||||||
|
return this.slide('prev')
|
||||||
|
}
|
||||||
|
|
||||||
|
Carousel.prototype.slide = function (type, next) {
|
||||||
|
var $active = this.$element.find('.item.active')
|
||||||
|
var $next = next || this.getItemForDirection(type, $active)
|
||||||
|
var isCycling = this.interval
|
||||||
|
var direction = type == 'next' ? 'left' : 'right'
|
||||||
|
var that = this
|
||||||
|
|
||||||
|
if ($next.hasClass('active')) return (this.sliding = false)
|
||||||
|
|
||||||
|
var relatedTarget = $next[0]
|
||||||
|
var slideEvent = $.Event('slide.bs.carousel', {
|
||||||
|
relatedTarget: relatedTarget,
|
||||||
|
direction: direction
|
||||||
|
})
|
||||||
|
this.$element.trigger(slideEvent)
|
||||||
|
if (slideEvent.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
this.sliding = true
|
||||||
|
|
||||||
|
isCycling && this.pause()
|
||||||
|
|
||||||
|
if (this.$indicators.length) {
|
||||||
|
this.$indicators.find('.active').removeClass('active')
|
||||||
|
var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
|
||||||
|
$nextIndicator && $nextIndicator.addClass('active')
|
||||||
|
}
|
||||||
|
|
||||||
|
var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
|
||||||
|
if ($.support.transition && this.$element.hasClass('slide')) {
|
||||||
|
$next.addClass(type)
|
||||||
|
$next[0].offsetWidth // force reflow
|
||||||
|
$active.addClass(direction)
|
||||||
|
$next.addClass(direction)
|
||||||
|
$active
|
||||||
|
.one('bsTransitionEnd', function () {
|
||||||
|
$next.removeClass([type, direction].join(' ')).addClass('active')
|
||||||
|
$active.removeClass(['active', direction].join(' '))
|
||||||
|
that.sliding = false
|
||||||
|
setTimeout(function () {
|
||||||
|
that.$element.trigger(slidEvent)
|
||||||
|
}, 0)
|
||||||
|
})
|
||||||
|
.emulateTransitionEnd(Carousel.TRANSITION_DURATION)
|
||||||
|
} else {
|
||||||
|
$active.removeClass('active')
|
||||||
|
$next.addClass('active')
|
||||||
|
this.sliding = false
|
||||||
|
this.$element.trigger(slidEvent)
|
||||||
|
}
|
||||||
|
|
||||||
|
isCycling && this.cycle()
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// CAROUSEL PLUGIN DEFINITION
|
||||||
|
// ==========================
|
||||||
|
|
||||||
|
function Plugin(option) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var data = $this.data('bs.carousel')
|
||||||
|
var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
|
||||||
|
var action = typeof option == 'string' ? option : options.slide
|
||||||
|
|
||||||
|
if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
|
||||||
|
if (typeof option == 'number') data.to(option)
|
||||||
|
else if (action) data[action]()
|
||||||
|
else if (options.interval) data.pause().cycle()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var old = $.fn.carousel
|
||||||
|
|
||||||
|
$.fn.carousel = Plugin
|
||||||
|
$.fn.carousel.Constructor = Carousel
|
||||||
|
|
||||||
|
|
||||||
|
// CAROUSEL NO CONFLICT
|
||||||
|
// ====================
|
||||||
|
|
||||||
|
$.fn.carousel.noConflict = function () {
|
||||||
|
$.fn.carousel = old
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// CAROUSEL DATA-API
|
||||||
|
// =================
|
||||||
|
|
||||||
|
var clickHandler = function (e) {
|
||||||
|
var href
|
||||||
|
var $this = $(this)
|
||||||
|
var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
|
||||||
|
if (!$target.hasClass('carousel')) return
|
||||||
|
var options = $.extend({}, $target.data(), $this.data())
|
||||||
|
var slideIndex = $this.attr('data-slide-to')
|
||||||
|
if (slideIndex) options.interval = false
|
||||||
|
|
||||||
|
Plugin.call($target, options)
|
||||||
|
|
||||||
|
if (slideIndex) {
|
||||||
|
$target.data('bs.carousel').to(slideIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
e.preventDefault()
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document)
|
||||||
|
.on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
|
||||||
|
.on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
|
||||||
|
|
||||||
|
$(window).on('load', function () {
|
||||||
|
$('[data-ride="carousel"]').each(function () {
|
||||||
|
var $carousel = $(this)
|
||||||
|
Plugin.call($carousel, $carousel.data())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
}(jQuery);
|
|
@ -0,0 +1,211 @@
|
||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: collapse.js v3.3.6
|
||||||
|
* http://getbootstrap.com/javascript/#collapse
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// COLLAPSE PUBLIC CLASS DEFINITION
|
||||||
|
// ================================
|
||||||
|
|
||||||
|
var Collapse = function (element, options) {
|
||||||
|
this.$element = $(element)
|
||||||
|
this.options = $.extend({}, Collapse.DEFAULTS, options)
|
||||||
|
this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
|
||||||
|
'[data-toggle="collapse"][data-target="#' + element.id + '"]')
|
||||||
|
this.transitioning = null
|
||||||
|
|
||||||
|
if (this.options.parent) {
|
||||||
|
this.$parent = this.getParent()
|
||||||
|
} else {
|
||||||
|
this.addAriaAndCollapsedClass(this.$element, this.$trigger)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.options.toggle) this.toggle()
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.VERSION = '3.3.6'
|
||||||
|
|
||||||
|
Collapse.TRANSITION_DURATION = 350
|
||||||
|
|
||||||
|
Collapse.DEFAULTS = {
|
||||||
|
toggle: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.prototype.dimension = function () {
|
||||||
|
var hasWidth = this.$element.hasClass('width')
|
||||||
|
return hasWidth ? 'width' : 'height'
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.prototype.show = function () {
|
||||||
|
if (this.transitioning || this.$element.hasClass('in')) return
|
||||||
|
|
||||||
|
var activesData
|
||||||
|
var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
|
||||||
|
|
||||||
|
if (actives && actives.length) {
|
||||||
|
activesData = actives.data('bs.collapse')
|
||||||
|
if (activesData && activesData.transitioning) return
|
||||||
|
}
|
||||||
|
|
||||||
|
var startEvent = $.Event('show.bs.collapse')
|
||||||
|
this.$element.trigger(startEvent)
|
||||||
|
if (startEvent.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
if (actives && actives.length) {
|
||||||
|
Plugin.call(actives, 'hide')
|
||||||
|
activesData || actives.data('bs.collapse', null)
|
||||||
|
}
|
||||||
|
|
||||||
|
var dimension = this.dimension()
|
||||||
|
|
||||||
|
this.$element
|
||||||
|
.removeClass('collapse')
|
||||||
|
.addClass('collapsing')[dimension](0)
|
||||||
|
.attr('aria-expanded', true)
|
||||||
|
|
||||||
|
this.$trigger
|
||||||
|
.removeClass('collapsed')
|
||||||
|
.attr('aria-expanded', true)
|
||||||
|
|
||||||
|
this.transitioning = 1
|
||||||
|
|
||||||
|
var complete = function () {
|
||||||
|
this.$element
|
||||||
|
.removeClass('collapsing')
|
||||||
|
.addClass('collapse in')[dimension]('')
|
||||||
|
this.transitioning = 0
|
||||||
|
this.$element
|
||||||
|
.trigger('shown.bs.collapse')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$.support.transition) return complete.call(this)
|
||||||
|
|
||||||
|
var scrollSize = $.camelCase(['scroll', dimension].join('-'))
|
||||||
|
|
||||||
|
this.$element
|
||||||
|
.one('bsTransitionEnd', $.proxy(complete, this))
|
||||||
|
.emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.prototype.hide = function () {
|
||||||
|
if (this.transitioning || !this.$element.hasClass('in')) return
|
||||||
|
|
||||||
|
var startEvent = $.Event('hide.bs.collapse')
|
||||||
|
this.$element.trigger(startEvent)
|
||||||
|
if (startEvent.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
var dimension = this.dimension()
|
||||||
|
|
||||||
|
this.$element[dimension](this.$element[dimension]())[0].offsetHeight
|
||||||
|
|
||||||
|
this.$element
|
||||||
|
.addClass('collapsing')
|
||||||
|
.removeClass('collapse in')
|
||||||
|
.attr('aria-expanded', false)
|
||||||
|
|
||||||
|
this.$trigger
|
||||||
|
.addClass('collapsed')
|
||||||
|
.attr('aria-expanded', false)
|
||||||
|
|
||||||
|
this.transitioning = 1
|
||||||
|
|
||||||
|
var complete = function () {
|
||||||
|
this.transitioning = 0
|
||||||
|
this.$element
|
||||||
|
.removeClass('collapsing')
|
||||||
|
.addClass('collapse')
|
||||||
|
.trigger('hidden.bs.collapse')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$.support.transition) return complete.call(this)
|
||||||
|
|
||||||
|
this.$element
|
||||||
|
[dimension](0)
|
||||||
|
.one('bsTransitionEnd', $.proxy(complete, this))
|
||||||
|
.emulateTransitionEnd(Collapse.TRANSITION_DURATION)
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.prototype.toggle = function () {
|
||||||
|
this[this.$element.hasClass('in') ? 'hide' : 'show']()
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.prototype.getParent = function () {
|
||||||
|
return $(this.options.parent)
|
||||||
|
.find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
|
||||||
|
.each($.proxy(function (i, element) {
|
||||||
|
var $element = $(element)
|
||||||
|
this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
|
||||||
|
}, this))
|
||||||
|
.end()
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
|
||||||
|
var isOpen = $element.hasClass('in')
|
||||||
|
|
||||||
|
$element.attr('aria-expanded', isOpen)
|
||||||
|
$trigger
|
||||||
|
.toggleClass('collapsed', !isOpen)
|
||||||
|
.attr('aria-expanded', isOpen)
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTargetFromTrigger($trigger) {
|
||||||
|
var href
|
||||||
|
var target = $trigger.attr('data-target')
|
||||||
|
|| (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
|
||||||
|
|
||||||
|
return $(target)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// COLLAPSE PLUGIN DEFINITION
|
||||||
|
// ==========================
|
||||||
|
|
||||||
|
function Plugin(option) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var data = $this.data('bs.collapse')
|
||||||
|
var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
|
||||||
|
|
||||||
|
if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
|
||||||
|
if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
|
||||||
|
if (typeof option == 'string') data[option]()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var old = $.fn.collapse
|
||||||
|
|
||||||
|
$.fn.collapse = Plugin
|
||||||
|
$.fn.collapse.Constructor = Collapse
|
||||||
|
|
||||||
|
|
||||||
|
// COLLAPSE NO CONFLICT
|
||||||
|
// ====================
|
||||||
|
|
||||||
|
$.fn.collapse.noConflict = function () {
|
||||||
|
$.fn.collapse = old
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// COLLAPSE DATA-API
|
||||||
|
// =================
|
||||||
|
|
||||||
|
$(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
|
||||||
|
var $this = $(this)
|
||||||
|
|
||||||
|
if (!$this.attr('data-target')) e.preventDefault()
|
||||||
|
|
||||||
|
var $target = getTargetFromTrigger($this)
|
||||||
|
var data = $target.data('bs.collapse')
|
||||||
|
var option = data ? 'toggle' : $this.data()
|
||||||
|
|
||||||
|
Plugin.call($target, option)
|
||||||
|
})
|
||||||
|
|
||||||
|
}(jQuery);
|
|
@ -0,0 +1,165 @@
|
||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: dropdown.js v3.3.6
|
||||||
|
* http://getbootstrap.com/javascript/#dropdowns
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// DROPDOWN CLASS DEFINITION
|
||||||
|
// =========================
|
||||||
|
|
||||||
|
var backdrop = '.dropdown-backdrop'
|
||||||
|
var toggle = '[data-toggle="dropdown"]'
|
||||||
|
var Dropdown = function (element) {
|
||||||
|
$(element).on('click.bs.dropdown', this.toggle)
|
||||||
|
}
|
||||||
|
|
||||||
|
Dropdown.VERSION = '3.3.6'
|
||||||
|
|
||||||
|
function getParent($this) {
|
||||||
|
var selector = $this.attr('data-target')
|
||||||
|
|
||||||
|
if (!selector) {
|
||||||
|
selector = $this.attr('href')
|
||||||
|
selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
|
||||||
|
}
|
||||||
|
|
||||||
|
var $parent = selector && $(selector)
|
||||||
|
|
||||||
|
return $parent && $parent.length ? $parent : $this.parent()
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearMenus(e) {
|
||||||
|
if (e && e.which === 3) return
|
||||||
|
$(backdrop).remove()
|
||||||
|
$(toggle).each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var $parent = getParent($this)
|
||||||
|
var relatedTarget = { relatedTarget: this }
|
||||||
|
|
||||||
|
if (!$parent.hasClass('open')) return
|
||||||
|
|
||||||
|
if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
|
||||||
|
|
||||||
|
$parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
|
||||||
|
|
||||||
|
if (e.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
$this.attr('aria-expanded', 'false')
|
||||||
|
$parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Dropdown.prototype.toggle = function (e) {
|
||||||
|
var $this = $(this)
|
||||||
|
|
||||||
|
if ($this.is('.disabled, :disabled')) return
|
||||||
|
|
||||||
|
var $parent = getParent($this)
|
||||||
|
var isActive = $parent.hasClass('open')
|
||||||
|
|
||||||
|
clearMenus()
|
||||||
|
|
||||||
|
if (!isActive) {
|
||||||
|
if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
|
||||||
|
// if mobile we use a backdrop because click events don't delegate
|
||||||
|
$(document.createElement('div'))
|
||||||
|
.addClass('dropdown-backdrop')
|
||||||
|
.insertAfter($(this))
|
||||||
|
.on('click', clearMenus)
|
||||||
|
}
|
||||||
|
|
||||||
|
var relatedTarget = { relatedTarget: this }
|
||||||
|
$parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
|
||||||
|
|
||||||
|
if (e.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
$this
|
||||||
|
.trigger('focus')
|
||||||
|
.attr('aria-expanded', 'true')
|
||||||
|
|
||||||
|
$parent
|
||||||
|
.toggleClass('open')
|
||||||
|
.trigger($.Event('shown.bs.dropdown', relatedTarget))
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
Dropdown.prototype.keydown = function (e) {
|
||||||
|
if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
|
||||||
|
|
||||||
|
var $this = $(this)
|
||||||
|
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopPropagation()
|
||||||
|
|
||||||
|
if ($this.is('.disabled, :disabled')) return
|
||||||
|
|
||||||
|
var $parent = getParent($this)
|
||||||
|
var isActive = $parent.hasClass('open')
|
||||||
|
|
||||||
|
if (!isActive && e.which != 27 || isActive && e.which == 27) {
|
||||||
|
if (e.which == 27) $parent.find(toggle).trigger('focus')
|
||||||
|
return $this.trigger('click')
|
||||||
|
}
|
||||||
|
|
||||||
|
var desc = ' li:not(.disabled):visible a'
|
||||||
|
var $items = $parent.find('.dropdown-menu' + desc)
|
||||||
|
|
||||||
|
if (!$items.length) return
|
||||||
|
|
||||||
|
var index = $items.index(e.target)
|
||||||
|
|
||||||
|
if (e.which == 38 && index > 0) index-- // up
|
||||||
|
if (e.which == 40 && index < $items.length - 1) index++ // down
|
||||||
|
if (!~index) index = 0
|
||||||
|
|
||||||
|
$items.eq(index).trigger('focus')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// DROPDOWN PLUGIN DEFINITION
|
||||||
|
// ==========================
|
||||||
|
|
||||||
|
function Plugin(option) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var data = $this.data('bs.dropdown')
|
||||||
|
|
||||||
|
if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
|
||||||
|
if (typeof option == 'string') data[option].call($this)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var old = $.fn.dropdown
|
||||||
|
|
||||||
|
$.fn.dropdown = Plugin
|
||||||
|
$.fn.dropdown.Constructor = Dropdown
|
||||||
|
|
||||||
|
|
||||||
|
// DROPDOWN NO CONFLICT
|
||||||
|
// ====================
|
||||||
|
|
||||||
|
$.fn.dropdown.noConflict = function () {
|
||||||
|
$.fn.dropdown = old
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// APPLY TO STANDARD DROPDOWN ELEMENTS
|
||||||
|
// ===================================
|
||||||
|
|
||||||
|
$(document)
|
||||||
|
.on('click.bs.dropdown.data-api', clearMenus)
|
||||||
|
.on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
|
||||||
|
.on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
|
||||||
|
.on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
|
||||||
|
.on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
|
||||||
|
|
||||||
|
}(jQuery);
|
|
@ -0,0 +1,337 @@
|
||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: modal.js v3.3.6
|
||||||
|
* http://getbootstrap.com/javascript/#modals
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// MODAL CLASS DEFINITION
|
||||||
|
// ======================
|
||||||
|
|
||||||
|
var Modal = function (element, options) {
|
||||||
|
this.options = options
|
||||||
|
this.$body = $(document.body)
|
||||||
|
this.$element = $(element)
|
||||||
|
this.$dialog = this.$element.find('.modal-dialog')
|
||||||
|
this.$backdrop = null
|
||||||
|
this.isShown = null
|
||||||
|
this.originalBodyPad = null
|
||||||
|
this.scrollbarWidth = 0
|
||||||
|
this.ignoreBackdropClick = false
|
||||||
|
|
||||||
|
if (this.options.remote) {
|
||||||
|
this.$element
|
||||||
|
.find('.modal-content')
|
||||||
|
.load(this.options.remote, $.proxy(function () {
|
||||||
|
this.$element.trigger('loaded.bs.modal')
|
||||||
|
}, this))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.VERSION = '3.3.6'
|
||||||
|
|
||||||
|
Modal.TRANSITION_DURATION = 300
|
||||||
|
Modal.BACKDROP_TRANSITION_DURATION = 150
|
||||||
|
|
||||||
|
Modal.DEFAULTS = {
|
||||||
|
backdrop: true,
|
||||||
|
keyboard: true,
|
||||||
|
show: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.toggle = function (_relatedTarget) {
|
||||||
|
return this.isShown ? this.hide() : this.show(_relatedTarget)
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.show = function (_relatedTarget) {
|
||||||
|
var that = this
|
||||||
|
var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
|
||||||
|
|
||||||
|
this.$element.trigger(e)
|
||||||
|
|
||||||
|
if (this.isShown || e.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
this.isShown = true
|
||||||
|
|
||||||
|
this.checkScrollbar()
|
||||||
|
this.setScrollbar()
|
||||||
|
this.$body.addClass('modal-open')
|
||||||
|
|
||||||
|
this.escape()
|
||||||
|
this.resize()
|
||||||
|
|
||||||
|
this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
|
||||||
|
|
||||||
|
this.$dialog.on('mousedown.dismiss.bs.modal', function () {
|
||||||
|
that.$element.one('mouseup.dismiss.bs.modal', function (e) {
|
||||||
|
if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
this.backdrop(function () {
|
||||||
|
var transition = $.support.transition && that.$element.hasClass('fade')
|
||||||
|
|
||||||
|
if (!that.$element.parent().length) {
|
||||||
|
that.$element.appendTo(that.$body) // don't move modals dom position
|
||||||
|
}
|
||||||
|
|
||||||
|
that.$element
|
||||||
|
.show()
|
||||||
|
.scrollTop(0)
|
||||||
|
|
||||||
|
that.adjustDialog()
|
||||||
|
|
||||||
|
if (transition) {
|
||||||
|
that.$element[0].offsetWidth // force reflow
|
||||||
|
}
|
||||||
|
|
||||||
|
that.$element.addClass('in')
|
||||||
|
|
||||||
|
that.enforceFocus()
|
||||||
|
|
||||||
|
var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
|
||||||
|
|
||||||
|
transition ?
|
||||||
|
that.$dialog // wait for modal to slide in
|
||||||
|
.one('bsTransitionEnd', function () {
|
||||||
|
that.$element.trigger('focus').trigger(e)
|
||||||
|
})
|
||||||
|
.emulateTransitionEnd(Modal.TRANSITION_DURATION) :
|
||||||
|
that.$element.trigger('focus').trigger(e)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.hide = function (e) {
|
||||||
|
if (e) e.preventDefault()
|
||||||
|
|
||||||
|
e = $.Event('hide.bs.modal')
|
||||||
|
|
||||||
|
this.$element.trigger(e)
|
||||||
|
|
||||||
|
if (!this.isShown || e.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
this.isShown = false
|
||||||
|
|
||||||
|
this.escape()
|
||||||
|
this.resize()
|
||||||
|
|
||||||
|
$(document).off('focusin.bs.modal')
|
||||||
|
|
||||||
|
this.$element
|
||||||
|
.removeClass('in')
|
||||||
|
.off('click.dismiss.bs.modal')
|
||||||
|
.off('mouseup.dismiss.bs.modal')
|
||||||
|
|
||||||
|
this.$dialog.off('mousedown.dismiss.bs.modal')
|
||||||
|
|
||||||
|
$.support.transition && this.$element.hasClass('fade') ?
|
||||||
|
this.$element
|
||||||
|
.one('bsTransitionEnd', $.proxy(this.hideModal, this))
|
||||||
|
.emulateTransitionEnd(Modal.TRANSITION_DURATION) :
|
||||||
|
this.hideModal()
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.enforceFocus = function () {
|
||||||
|
$(document)
|
||||||
|
.off('focusin.bs.modal') // guard against infinite focus loop
|
||||||
|
.on('focusin.bs.modal', $.proxy(function (e) {
|
||||||
|
if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
|
||||||
|
this.$element.trigger('focus')
|
||||||
|
}
|
||||||
|
}, this))
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.escape = function () {
|
||||||
|
if (this.isShown && this.options.keyboard) {
|
||||||
|
this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
|
||||||
|
e.which == 27 && this.hide()
|
||||||
|
}, this))
|
||||||
|
} else if (!this.isShown) {
|
||||||
|
this.$element.off('keydown.dismiss.bs.modal')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.resize = function () {
|
||||||
|
if (this.isShown) {
|
||||||
|
$(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
|
||||||
|
} else {
|
||||||
|
$(window).off('resize.bs.modal')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.hideModal = function () {
|
||||||
|
var that = this
|
||||||
|
this.$element.hide()
|
||||||
|
this.backdrop(function () {
|
||||||
|
that.$body.removeClass('modal-open')
|
||||||
|
that.resetAdjustments()
|
||||||
|
that.resetScrollbar()
|
||||||
|
that.$element.trigger('hidden.bs.modal')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.removeBackdrop = function () {
|
||||||
|
this.$backdrop && this.$backdrop.remove()
|
||||||
|
this.$backdrop = null
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.backdrop = function (callback) {
|
||||||
|
var that = this
|
||||||
|
var animate = this.$element.hasClass('fade') ? 'fade' : ''
|
||||||
|
|
||||||
|
if (this.isShown && this.options.backdrop) {
|
||||||
|
var doAnimate = $.support.transition && animate
|
||||||
|
|
||||||
|
this.$backdrop = $(document.createElement('div'))
|
||||||
|
.addClass('modal-backdrop ' + animate)
|
||||||
|
.appendTo(this.$body)
|
||||||
|
|
||||||
|
this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
|
||||||
|
if (this.ignoreBackdropClick) {
|
||||||
|
this.ignoreBackdropClick = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (e.target !== e.currentTarget) return
|
||||||
|
this.options.backdrop == 'static'
|
||||||
|
? this.$element[0].focus()
|
||||||
|
: this.hide()
|
||||||
|
}, this))
|
||||||
|
|
||||||
|
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
|
||||||
|
|
||||||
|
this.$backdrop.addClass('in')
|
||||||
|
|
||||||
|
if (!callback) return
|
||||||
|
|
||||||
|
doAnimate ?
|
||||||
|
this.$backdrop
|
||||||
|
.one('bsTransitionEnd', callback)
|
||||||
|
.emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
|
||||||
|
callback()
|
||||||
|
|
||||||
|
} else if (!this.isShown && this.$backdrop) {
|
||||||
|
this.$backdrop.removeClass('in')
|
||||||
|
|
||||||
|
var callbackRemove = function () {
|
||||||
|
that.removeBackdrop()
|
||||||
|
callback && callback()
|
||||||
|
}
|
||||||
|
$.support.transition && this.$element.hasClass('fade') ?
|
||||||
|
this.$backdrop
|
||||||
|
.one('bsTransitionEnd', callbackRemove)
|
||||||
|
.emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
|
||||||
|
callbackRemove()
|
||||||
|
|
||||||
|
} else if (callback) {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// these following methods are used to handle overflowing modals
|
||||||
|
|
||||||
|
Modal.prototype.handleUpdate = function () {
|
||||||
|
this.adjustDialog()
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.adjustDialog = function () {
|
||||||
|
var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
|
||||||
|
|
||||||
|
this.$element.css({
|
||||||
|
paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
|
||||||
|
paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.resetAdjustments = function () {
|
||||||
|
this.$element.css({
|
||||||
|
paddingLeft: '',
|
||||||
|
paddingRight: ''
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.checkScrollbar = function () {
|
||||||
|
var fullWindowWidth = window.innerWidth
|
||||||
|
if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
|
||||||
|
var documentElementRect = document.documentElement.getBoundingClientRect()
|
||||||
|
fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
|
||||||
|
}
|
||||||
|
this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
|
||||||
|
this.scrollbarWidth = this.measureScrollbar()
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.setScrollbar = function () {
|
||||||
|
var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
|
||||||
|
this.originalBodyPad = document.body.style.paddingRight || ''
|
||||||
|
if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.resetScrollbar = function () {
|
||||||
|
this.$body.css('padding-right', this.originalBodyPad)
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.prototype.measureScrollbar = function () { // thx walsh
|
||||||
|
var scrollDiv = document.createElement('div')
|
||||||
|
scrollDiv.className = 'modal-scrollbar-measure'
|
||||||
|
this.$body.append(scrollDiv)
|
||||||
|
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
|
||||||
|
this.$body[0].removeChild(scrollDiv)
|
||||||
|
return scrollbarWidth
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// MODAL PLUGIN DEFINITION
|
||||||
|
// =======================
|
||||||
|
|
||||||
|
function Plugin(option, _relatedTarget) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var data = $this.data('bs.modal')
|
||||||
|
var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
|
||||||
|
|
||||||
|
if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
|
||||||
|
if (typeof option == 'string') data[option](_relatedTarget)
|
||||||
|
else if (options.show) data.show(_relatedTarget)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var old = $.fn.modal
|
||||||
|
|
||||||
|
$.fn.modal = Plugin
|
||||||
|
$.fn.modal.Constructor = Modal
|
||||||
|
|
||||||
|
|
||||||
|
// MODAL NO CONFLICT
|
||||||
|
// =================
|
||||||
|
|
||||||
|
$.fn.modal.noConflict = function () {
|
||||||
|
$.fn.modal = old
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// MODAL DATA-API
|
||||||
|
// ==============
|
||||||
|
|
||||||
|
$(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
|
||||||
|
var $this = $(this)
|
||||||
|
var href = $this.attr('href')
|
||||||
|
var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
|
||||||
|
var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
|
||||||
|
|
||||||
|
if ($this.is('a')) e.preventDefault()
|
||||||
|
|
||||||
|
$target.one('show.bs.modal', function (showEvent) {
|
||||||
|
if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
|
||||||
|
$target.one('hidden.bs.modal', function () {
|
||||||
|
$this.is(':visible') && $this.trigger('focus')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
Plugin.call($target, option, this)
|
||||||
|
})
|
||||||
|
|
||||||
|
}(jQuery);
|
|
@ -0,0 +1,108 @@
|
||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: popover.js v3.3.6
|
||||||
|
* http://getbootstrap.com/javascript/#popovers
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// POPOVER PUBLIC CLASS DEFINITION
|
||||||
|
// ===============================
|
||||||
|
|
||||||
|
var Popover = function (element, options) {
|
||||||
|
this.init('popover', element, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
|
||||||
|
|
||||||
|
Popover.VERSION = '3.3.6'
|
||||||
|
|
||||||
|
Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
|
||||||
|
placement: 'right',
|
||||||
|
trigger: 'click',
|
||||||
|
content: '',
|
||||||
|
template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// NOTE: POPOVER EXTENDS tooltip.js
|
||||||
|
// ================================
|
||||||
|
|
||||||
|
Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
|
||||||
|
|
||||||
|
Popover.prototype.constructor = Popover
|
||||||
|
|
||||||
|
Popover.prototype.getDefaults = function () {
|
||||||
|
return Popover.DEFAULTS
|
||||||
|
}
|
||||||
|
|
||||||
|
Popover.prototype.setContent = function () {
|
||||||
|
var $tip = this.tip()
|
||||||
|
var title = this.getTitle()
|
||||||
|
var content = this.getContent()
|
||||||
|
|
||||||
|
$tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
|
||||||
|
$tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
|
||||||
|
this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
|
||||||
|
](content)
|
||||||
|
|
||||||
|
$tip.removeClass('fade top bottom left right in')
|
||||||
|
|
||||||
|
// IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
|
||||||
|
// this manually by checking the contents.
|
||||||
|
if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
|
||||||
|
}
|
||||||
|
|
||||||
|
Popover.prototype.hasContent = function () {
|
||||||
|
return this.getTitle() || this.getContent()
|
||||||
|
}
|
||||||
|
|
||||||
|
Popover.prototype.getContent = function () {
|
||||||
|
var $e = this.$element
|
||||||
|
var o = this.options
|
||||||
|
|
||||||
|
return $e.attr('data-content')
|
||||||
|
|| (typeof o.content == 'function' ?
|
||||||
|
o.content.call($e[0]) :
|
||||||
|
o.content)
|
||||||
|
}
|
||||||
|
|
||||||
|
Popover.prototype.arrow = function () {
|
||||||
|
return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// POPOVER PLUGIN DEFINITION
|
||||||
|
// =========================
|
||||||
|
|
||||||
|
function Plugin(option) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var data = $this.data('bs.popover')
|
||||||
|
var options = typeof option == 'object' && option
|
||||||
|
|
||||||
|
if (!data && /destroy|hide/.test(option)) return
|
||||||
|
if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
|
||||||
|
if (typeof option == 'string') data[option]()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var old = $.fn.popover
|
||||||
|
|
||||||
|
$.fn.popover = Plugin
|
||||||
|
$.fn.popover.Constructor = Popover
|
||||||
|
|
||||||
|
|
||||||
|
// POPOVER NO CONFLICT
|
||||||
|
// ===================
|
||||||
|
|
||||||
|
$.fn.popover.noConflict = function () {
|
||||||
|
$.fn.popover = old
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
}(jQuery);
|
|
@ -0,0 +1,172 @@
|
||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: scrollspy.js v3.3.6
|
||||||
|
* http://getbootstrap.com/javascript/#scrollspy
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// SCROLLSPY CLASS DEFINITION
|
||||||
|
// ==========================
|
||||||
|
|
||||||
|
function ScrollSpy(element, options) {
|
||||||
|
this.$body = $(document.body)
|
||||||
|
this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
|
||||||
|
this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
|
||||||
|
this.selector = (this.options.target || '') + ' .nav li > a'
|
||||||
|
this.offsets = []
|
||||||
|
this.targets = []
|
||||||
|
this.activeTarget = null
|
||||||
|
this.scrollHeight = 0
|
||||||
|
|
||||||
|
this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
|
||||||
|
this.refresh()
|
||||||
|
this.process()
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollSpy.VERSION = '3.3.6'
|
||||||
|
|
||||||
|
ScrollSpy.DEFAULTS = {
|
||||||
|
offset: 10
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollSpy.prototype.getScrollHeight = function () {
|
||||||
|
return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollSpy.prototype.refresh = function () {
|
||||||
|
var that = this
|
||||||
|
var offsetMethod = 'offset'
|
||||||
|
var offsetBase = 0
|
||||||
|
|
||||||
|
this.offsets = []
|
||||||
|
this.targets = []
|
||||||
|
this.scrollHeight = this.getScrollHeight()
|
||||||
|
|
||||||
|
if (!$.isWindow(this.$scrollElement[0])) {
|
||||||
|
offsetMethod = 'position'
|
||||||
|
offsetBase = this.$scrollElement.scrollTop()
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$body
|
||||||
|
.find(this.selector)
|
||||||
|
.map(function () {
|
||||||
|
var $el = $(this)
|
||||||
|
var href = $el.data('target') || $el.attr('href')
|
||||||
|
var $href = /^#./.test(href) && $(href)
|
||||||
|
|
||||||
|
return ($href
|
||||||
|
&& $href.length
|
||||||
|
&& $href.is(':visible')
|
||||||
|
&& [[$href[offsetMethod]().top + offsetBase, href]]) || null
|
||||||
|
})
|
||||||
|
.sort(function (a, b) { return a[0] - b[0] })
|
||||||
|
.each(function () {
|
||||||
|
that.offsets.push(this[0])
|
||||||
|
that.targets.push(this[1])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollSpy.prototype.process = function () {
|
||||||
|
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
|
||||||
|
var scrollHeight = this.getScrollHeight()
|
||||||
|
var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
|
||||||
|
var offsets = this.offsets
|
||||||
|
var targets = this.targets
|
||||||
|
var activeTarget = this.activeTarget
|
||||||
|
var i
|
||||||
|
|
||||||
|
if (this.scrollHeight != scrollHeight) {
|
||||||
|
this.refresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scrollTop >= maxScroll) {
|
||||||
|
return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeTarget && scrollTop < offsets[0]) {
|
||||||
|
this.activeTarget = null
|
||||||
|
return this.clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = offsets.length; i--;) {
|
||||||
|
activeTarget != targets[i]
|
||||||
|
&& scrollTop >= offsets[i]
|
||||||
|
&& (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
|
||||||
|
&& this.activate(targets[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollSpy.prototype.activate = function (target) {
|
||||||
|
this.activeTarget = target
|
||||||
|
|
||||||
|
this.clear()
|
||||||
|
|
||||||
|
var selector = this.selector +
|
||||||
|
'[data-target="' + target + '"],' +
|
||||||
|
this.selector + '[href="' + target + '"]'
|
||||||
|
|
||||||
|
var active = $(selector)
|
||||||
|
.parents('li')
|
||||||
|
.addClass('active')
|
||||||
|
|
||||||
|
if (active.parent('.dropdown-menu').length) {
|
||||||
|
active = active
|
||||||
|
.closest('li.dropdown')
|
||||||
|
.addClass('active')
|
||||||
|
}
|
||||||
|
|
||||||
|
active.trigger('activate.bs.scrollspy')
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollSpy.prototype.clear = function () {
|
||||||
|
$(this.selector)
|
||||||
|
.parentsUntil(this.options.target, '.active')
|
||||||
|
.removeClass('active')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// SCROLLSPY PLUGIN DEFINITION
|
||||||
|
// ===========================
|
||||||
|
|
||||||
|
function Plugin(option) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var data = $this.data('bs.scrollspy')
|
||||||
|
var options = typeof option == 'object' && option
|
||||||
|
|
||||||
|
if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
|
||||||
|
if (typeof option == 'string') data[option]()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var old = $.fn.scrollspy
|
||||||
|
|
||||||
|
$.fn.scrollspy = Plugin
|
||||||
|
$.fn.scrollspy.Constructor = ScrollSpy
|
||||||
|
|
||||||
|
|
||||||
|
// SCROLLSPY NO CONFLICT
|
||||||
|
// =====================
|
||||||
|
|
||||||
|
$.fn.scrollspy.noConflict = function () {
|
||||||
|
$.fn.scrollspy = old
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// SCROLLSPY DATA-API
|
||||||
|
// ==================
|
||||||
|
|
||||||
|
$(window).on('load.bs.scrollspy.data-api', function () {
|
||||||
|
$('[data-spy="scroll"]').each(function () {
|
||||||
|
var $spy = $(this)
|
||||||
|
Plugin.call($spy, $spy.data())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
}(jQuery);
|
|
@ -0,0 +1,155 @@
|
||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: tab.js v3.3.6
|
||||||
|
* http://getbootstrap.com/javascript/#tabs
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// TAB CLASS DEFINITION
|
||||||
|
// ====================
|
||||||
|
|
||||||
|
var Tab = function (element) {
|
||||||
|
// jscs:disable requireDollarBeforejQueryAssignment
|
||||||
|
this.element = $(element)
|
||||||
|
// jscs:enable requireDollarBeforejQueryAssignment
|
||||||
|
}
|
||||||
|
|
||||||
|
Tab.VERSION = '3.3.6'
|
||||||
|
|
||||||
|
Tab.TRANSITION_DURATION = 150
|
||||||
|
|
||||||
|
Tab.prototype.show = function () {
|
||||||
|
var $this = this.element
|
||||||
|
var $ul = $this.closest('ul:not(.dropdown-menu)')
|
||||||
|
var selector = $this.data('target')
|
||||||
|
|
||||||
|
if (!selector) {
|
||||||
|
selector = $this.attr('href')
|
||||||
|
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this.parent('li').hasClass('active')) return
|
||||||
|
|
||||||
|
var $previous = $ul.find('.active:last a')
|
||||||
|
var hideEvent = $.Event('hide.bs.tab', {
|
||||||
|
relatedTarget: $this[0]
|
||||||
|
})
|
||||||
|
var showEvent = $.Event('show.bs.tab', {
|
||||||
|
relatedTarget: $previous[0]
|
||||||
|
})
|
||||||
|
|
||||||
|
$previous.trigger(hideEvent)
|
||||||
|
$this.trigger(showEvent)
|
||||||
|
|
||||||
|
if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
var $target = $(selector)
|
||||||
|
|
||||||
|
this.activate($this.closest('li'), $ul)
|
||||||
|
this.activate($target, $target.parent(), function () {
|
||||||
|
$previous.trigger({
|
||||||
|
type: 'hidden.bs.tab',
|
||||||
|
relatedTarget: $this[0]
|
||||||
|
})
|
||||||
|
$this.trigger({
|
||||||
|
type: 'shown.bs.tab',
|
||||||
|
relatedTarget: $previous[0]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Tab.prototype.activate = function (element, container, callback) {
|
||||||
|
var $active = container.find('> .active')
|
||||||
|
var transition = callback
|
||||||
|
&& $.support.transition
|
||||||
|
&& ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
|
||||||
|
|
||||||
|
function next() {
|
||||||
|
$active
|
||||||
|
.removeClass('active')
|
||||||
|
.find('> .dropdown-menu > .active')
|
||||||
|
.removeClass('active')
|
||||||
|
.end()
|
||||||
|
.find('[data-toggle="tab"]')
|
||||||
|
.attr('aria-expanded', false)
|
||||||
|
|
||||||
|
element
|
||||||
|
.addClass('active')
|
||||||
|
.find('[data-toggle="tab"]')
|
||||||
|
.attr('aria-expanded', true)
|
||||||
|
|
||||||
|
if (transition) {
|
||||||
|
element[0].offsetWidth // reflow for transition
|
||||||
|
element.addClass('in')
|
||||||
|
} else {
|
||||||
|
element.removeClass('fade')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element.parent('.dropdown-menu').length) {
|
||||||
|
element
|
||||||
|
.closest('li.dropdown')
|
||||||
|
.addClass('active')
|
||||||
|
.end()
|
||||||
|
.find('[data-toggle="tab"]')
|
||||||
|
.attr('aria-expanded', true)
|
||||||
|
}
|
||||||
|
|
||||||
|
callback && callback()
|
||||||
|
}
|
||||||
|
|
||||||
|
$active.length && transition ?
|
||||||
|
$active
|
||||||
|
.one('bsTransitionEnd', next)
|
||||||
|
.emulateTransitionEnd(Tab.TRANSITION_DURATION) :
|
||||||
|
next()
|
||||||
|
|
||||||
|
$active.removeClass('in')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TAB PLUGIN DEFINITION
|
||||||
|
// =====================
|
||||||
|
|
||||||
|
function Plugin(option) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var data = $this.data('bs.tab')
|
||||||
|
|
||||||
|
if (!data) $this.data('bs.tab', (data = new Tab(this)))
|
||||||
|
if (typeof option == 'string') data[option]()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var old = $.fn.tab
|
||||||
|
|
||||||
|
$.fn.tab = Plugin
|
||||||
|
$.fn.tab.Constructor = Tab
|
||||||
|
|
||||||
|
|
||||||
|
// TAB NO CONFLICT
|
||||||
|
// ===============
|
||||||
|
|
||||||
|
$.fn.tab.noConflict = function () {
|
||||||
|
$.fn.tab = old
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TAB DATA-API
|
||||||
|
// ============
|
||||||
|
|
||||||
|
var clickHandler = function (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
Plugin.call($(this), 'show')
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document)
|
||||||
|
.on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
|
||||||
|
.on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
|
||||||
|
|
||||||
|
}(jQuery);
|
|
@ -0,0 +1,514 @@
|
||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: tooltip.js v3.3.6
|
||||||
|
* http://getbootstrap.com/javascript/#tooltip
|
||||||
|
* Inspired by the original jQuery.tipsy by Jason Frame
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// TOOLTIP PUBLIC CLASS DEFINITION
|
||||||
|
// ===============================
|
||||||
|
|
||||||
|
var Tooltip = function (element, options) {
|
||||||
|
this.type = null
|
||||||
|
this.options = null
|
||||||
|
this.enabled = null
|
||||||
|
this.timeout = null
|
||||||
|
this.hoverState = null
|
||||||
|
this.$element = null
|
||||||
|
this.inState = null
|
||||||
|
|
||||||
|
this.init('tooltip', element, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.VERSION = '3.3.6'
|
||||||
|
|
||||||
|
Tooltip.TRANSITION_DURATION = 150
|
||||||
|
|
||||||
|
Tooltip.DEFAULTS = {
|
||||||
|
animation: true,
|
||||||
|
placement: 'top',
|
||||||
|
selector: false,
|
||||||
|
template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
|
||||||
|
trigger: 'hover focus',
|
||||||
|
title: '',
|
||||||
|
delay: 0,
|
||||||
|
html: false,
|
||||||
|
container: false,
|
||||||
|
viewport: {
|
||||||
|
selector: 'body',
|
||||||
|
padding: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.init = function (type, element, options) {
|
||||||
|
this.enabled = true
|
||||||
|
this.type = type
|
||||||
|
this.$element = $(element)
|
||||||
|
this.options = this.getOptions(options)
|
||||||
|
this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
|
||||||
|
this.inState = { click: false, hover: false, focus: false }
|
||||||
|
|
||||||
|
if (this.$element[0] instanceof document.constructor && !this.options.selector) {
|
||||||
|
throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
|
||||||
|
}
|
||||||
|
|
||||||
|
var triggers = this.options.trigger.split(' ')
|
||||||
|
|
||||||
|
for (var i = triggers.length; i--;) {
|
||||||
|
var trigger = triggers[i]
|
||||||
|
|
||||||
|
if (trigger == 'click') {
|
||||||
|
this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
|
||||||
|
} else if (trigger != 'manual') {
|
||||||
|
var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
|
||||||
|
var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
|
||||||
|
|
||||||
|
this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
|
||||||
|
this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.options.selector ?
|
||||||
|
(this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
|
||||||
|
this.fixTitle()
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.getDefaults = function () {
|
||||||
|
return Tooltip.DEFAULTS
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.getOptions = function (options) {
|
||||||
|
options = $.extend({}, this.getDefaults(), this.$element.data(), options)
|
||||||
|
|
||||||
|
if (options.delay && typeof options.delay == 'number') {
|
||||||
|
options.delay = {
|
||||||
|
show: options.delay,
|
||||||
|
hide: options.delay
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return options
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.getDelegateOptions = function () {
|
||||||
|
var options = {}
|
||||||
|
var defaults = this.getDefaults()
|
||||||
|
|
||||||
|
this._options && $.each(this._options, function (key, value) {
|
||||||
|
if (defaults[key] != value) options[key] = value
|
||||||
|
})
|
||||||
|
|
||||||
|
return options
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.enter = function (obj) {
|
||||||
|
var self = obj instanceof this.constructor ?
|
||||||
|
obj : $(obj.currentTarget).data('bs.' + this.type)
|
||||||
|
|
||||||
|
if (!self) {
|
||||||
|
self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
|
||||||
|
$(obj.currentTarget).data('bs.' + this.type, self)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj instanceof $.Event) {
|
||||||
|
self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self.tip().hasClass('in') || self.hoverState == 'in') {
|
||||||
|
self.hoverState = 'in'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
clearTimeout(self.timeout)
|
||||||
|
|
||||||
|
self.hoverState = 'in'
|
||||||
|
|
||||||
|
if (!self.options.delay || !self.options.delay.show) return self.show()
|
||||||
|
|
||||||
|
self.timeout = setTimeout(function () {
|
||||||
|
if (self.hoverState == 'in') self.show()
|
||||||
|
}, self.options.delay.show)
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.isInStateTrue = function () {
|
||||||
|
for (var key in this.inState) {
|
||||||
|
if (this.inState[key]) return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.leave = function (obj) {
|
||||||
|
var self = obj instanceof this.constructor ?
|
||||||
|
obj : $(obj.currentTarget).data('bs.' + this.type)
|
||||||
|
|
||||||
|
if (!self) {
|
||||||
|
self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
|
||||||
|
$(obj.currentTarget).data('bs.' + this.type, self)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj instanceof $.Event) {
|
||||||
|
self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self.isInStateTrue()) return
|
||||||
|
|
||||||
|
clearTimeout(self.timeout)
|
||||||
|
|
||||||
|
self.hoverState = 'out'
|
||||||
|
|
||||||
|
if (!self.options.delay || !self.options.delay.hide) return self.hide()
|
||||||
|
|
||||||
|
self.timeout = setTimeout(function () {
|
||||||
|
if (self.hoverState == 'out') self.hide()
|
||||||
|
}, self.options.delay.hide)
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.show = function () {
|
||||||
|
var e = $.Event('show.bs.' + this.type)
|
||||||
|
|
||||||
|
if (this.hasContent() && this.enabled) {
|
||||||
|
this.$element.trigger(e)
|
||||||
|
|
||||||
|
var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
|
||||||
|
if (e.isDefaultPrevented() || !inDom) return
|
||||||
|
var that = this
|
||||||
|
|
||||||
|
var $tip = this.tip()
|
||||||
|
|
||||||
|
var tipId = this.getUID(this.type)
|
||||||
|
|
||||||
|
this.setContent()
|
||||||
|
$tip.attr('id', tipId)
|
||||||
|
this.$element.attr('aria-describedby', tipId)
|
||||||
|
|
||||||
|
if (this.options.animation) $tip.addClass('fade')
|
||||||
|
|
||||||
|
var placement = typeof this.options.placement == 'function' ?
|
||||||
|
this.options.placement.call(this, $tip[0], this.$element[0]) :
|
||||||
|
this.options.placement
|
||||||
|
|
||||||
|
var autoToken = /\s?auto?\s?/i
|
||||||
|
var autoPlace = autoToken.test(placement)
|
||||||
|
if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
|
||||||
|
|
||||||
|
$tip
|
||||||
|
.detach()
|
||||||
|
.css({ top: 0, left: 0, display: 'block' })
|
||||||
|
.addClass(placement)
|
||||||
|
.data('bs.' + this.type, this)
|
||||||
|
|
||||||
|
this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
|
||||||
|
this.$element.trigger('inserted.bs.' + this.type)
|
||||||
|
|
||||||
|
var pos = this.getPosition()
|
||||||
|
var actualWidth = $tip[0].offsetWidth
|
||||||
|
var actualHeight = $tip[0].offsetHeight
|
||||||
|
|
||||||
|
if (autoPlace) {
|
||||||
|
var orgPlacement = placement
|
||||||
|
var viewportDim = this.getPosition(this.$viewport)
|
||||||
|
|
||||||
|
placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :
|
||||||
|
placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :
|
||||||
|
placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :
|
||||||
|
placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :
|
||||||
|
placement
|
||||||
|
|
||||||
|
$tip
|
||||||
|
.removeClass(orgPlacement)
|
||||||
|
.addClass(placement)
|
||||||
|
}
|
||||||
|
|
||||||
|
var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
|
||||||
|
|
||||||
|
this.applyPlacement(calculatedOffset, placement)
|
||||||
|
|
||||||
|
var complete = function () {
|
||||||
|
var prevHoverState = that.hoverState
|
||||||
|
that.$element.trigger('shown.bs.' + that.type)
|
||||||
|
that.hoverState = null
|
||||||
|
|
||||||
|
if (prevHoverState == 'out') that.leave(that)
|
||||||
|
}
|
||||||
|
|
||||||
|
$.support.transition && this.$tip.hasClass('fade') ?
|
||||||
|
$tip
|
||||||
|
.one('bsTransitionEnd', complete)
|
||||||
|
.emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
|
||||||
|
complete()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.applyPlacement = function (offset, placement) {
|
||||||
|
var $tip = this.tip()
|
||||||
|
var width = $tip[0].offsetWidth
|
||||||
|
var height = $tip[0].offsetHeight
|
||||||
|
|
||||||
|
// manually read margins because getBoundingClientRect includes difference
|
||||||
|
var marginTop = parseInt($tip.css('margin-top'), 10)
|
||||||
|
var marginLeft = parseInt($tip.css('margin-left'), 10)
|
||||||
|
|
||||||
|
// we must check for NaN for ie 8/9
|
||||||
|
if (isNaN(marginTop)) marginTop = 0
|
||||||
|
if (isNaN(marginLeft)) marginLeft = 0
|
||||||
|
|
||||||
|
offset.top += marginTop
|
||||||
|
offset.left += marginLeft
|
||||||
|
|
||||||
|
// $.fn.offset doesn't round pixel values
|
||||||
|
// so we use setOffset directly with our own function B-0
|
||||||
|
$.offset.setOffset($tip[0], $.extend({
|
||||||
|
using: function (props) {
|
||||||
|
$tip.css({
|
||||||
|
top: Math.round(props.top),
|
||||||
|
left: Math.round(props.left)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}, offset), 0)
|
||||||
|
|
||||||
|
$tip.addClass('in')
|
||||||
|
|
||||||
|
// check to see if placing tip in new offset caused the tip to resize itself
|
||||||
|
var actualWidth = $tip[0].offsetWidth
|
||||||
|
var actualHeight = $tip[0].offsetHeight
|
||||||
|
|
||||||
|
if (placement == 'top' && actualHeight != height) {
|
||||||
|
offset.top = offset.top + height - actualHeight
|
||||||
|
}
|
||||||
|
|
||||||
|
var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
|
||||||
|
|
||||||
|
if (delta.left) offset.left += delta.left
|
||||||
|
else offset.top += delta.top
|
||||||
|
|
||||||
|
var isVertical = /top|bottom/.test(placement)
|
||||||
|
var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
|
||||||
|
var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
|
||||||
|
|
||||||
|
$tip.offset(offset)
|
||||||
|
this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
|
||||||
|
this.arrow()
|
||||||
|
.css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
|
||||||
|
.css(isVertical ? 'top' : 'left', '')
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.setContent = function () {
|
||||||
|
var $tip = this.tip()
|
||||||
|
var title = this.getTitle()
|
||||||
|
|
||||||
|
$tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
|
||||||
|
$tip.removeClass('fade in top bottom left right')
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.hide = function (callback) {
|
||||||
|
var that = this
|
||||||
|
var $tip = $(this.$tip)
|
||||||
|
var e = $.Event('hide.bs.' + this.type)
|
||||||
|
|
||||||
|
function complete() {
|
||||||
|
if (that.hoverState != 'in') $tip.detach()
|
||||||
|
that.$element
|
||||||
|
.removeAttr('aria-describedby')
|
||||||
|
.trigger('hidden.bs.' + that.type)
|
||||||
|
callback && callback()
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$element.trigger(e)
|
||||||
|
|
||||||
|
if (e.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
$tip.removeClass('in')
|
||||||
|
|
||||||
|
$.support.transition && $tip.hasClass('fade') ?
|
||||||
|
$tip
|
||||||
|
.one('bsTransitionEnd', complete)
|
||||||
|
.emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
|
||||||
|
complete()
|
||||||
|
|
||||||
|
this.hoverState = null
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.fixTitle = function () {
|
||||||
|
var $e = this.$element
|
||||||
|
if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
|
||||||
|
$e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.hasContent = function () {
|
||||||
|
return this.getTitle()
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.getPosition = function ($element) {
|
||||||
|
$element = $element || this.$element
|
||||||
|
|
||||||
|
var el = $element[0]
|
||||||
|
var isBody = el.tagName == 'BODY'
|
||||||
|
|
||||||
|
var elRect = el.getBoundingClientRect()
|
||||||
|
if (elRect.width == null) {
|
||||||
|
// width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
|
||||||
|
elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
|
||||||
|
}
|
||||||
|
var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
|
||||||
|
var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
|
||||||
|
var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
|
||||||
|
|
||||||
|
return $.extend({}, elRect, scroll, outerDims, elOffset)
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
|
||||||
|
return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
|
||||||
|
placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
|
||||||
|
placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
|
||||||
|
/* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
|
||||||
|
var delta = { top: 0, left: 0 }
|
||||||
|
if (!this.$viewport) return delta
|
||||||
|
|
||||||
|
var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
|
||||||
|
var viewportDimensions = this.getPosition(this.$viewport)
|
||||||
|
|
||||||
|
if (/right|left/.test(placement)) {
|
||||||
|
var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
|
||||||
|
var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
|
||||||
|
if (topEdgeOffset < viewportDimensions.top) { // top overflow
|
||||||
|
delta.top = viewportDimensions.top - topEdgeOffset
|
||||||
|
} else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
|
||||||
|
delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var leftEdgeOffset = pos.left - viewportPadding
|
||||||
|
var rightEdgeOffset = pos.left + viewportPadding + actualWidth
|
||||||
|
if (leftEdgeOffset < viewportDimensions.left) { // left overflow
|
||||||
|
delta.left = viewportDimensions.left - leftEdgeOffset
|
||||||
|
} else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
|
||||||
|
delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return delta
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.getTitle = function () {
|
||||||
|
var title
|
||||||
|
var $e = this.$element
|
||||||
|
var o = this.options
|
||||||
|
|
||||||
|
title = $e.attr('data-original-title')
|
||||||
|
|| (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
|
||||||
|
|
||||||
|
return title
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.getUID = function (prefix) {
|
||||||
|
do prefix += ~~(Math.random() * 1000000)
|
||||||
|
while (document.getElementById(prefix))
|
||||||
|
return prefix
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.tip = function () {
|
||||||
|
if (!this.$tip) {
|
||||||
|
this.$tip = $(this.options.template)
|
||||||
|
if (this.$tip.length != 1) {
|
||||||
|
throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.$tip
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.arrow = function () {
|
||||||
|
return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.enable = function () {
|
||||||
|
this.enabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.disable = function () {
|
||||||
|
this.enabled = false
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.toggleEnabled = function () {
|
||||||
|
this.enabled = !this.enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.toggle = function (e) {
|
||||||
|
var self = this
|
||||||
|
if (e) {
|
||||||
|
self = $(e.currentTarget).data('bs.' + this.type)
|
||||||
|
if (!self) {
|
||||||
|
self = new this.constructor(e.currentTarget, this.getDelegateOptions())
|
||||||
|
$(e.currentTarget).data('bs.' + this.type, self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e) {
|
||||||
|
self.inState.click = !self.inState.click
|
||||||
|
if (self.isInStateTrue()) self.enter(self)
|
||||||
|
else self.leave(self)
|
||||||
|
} else {
|
||||||
|
self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Tooltip.prototype.destroy = function () {
|
||||||
|
var that = this
|
||||||
|
clearTimeout(this.timeout)
|
||||||
|
this.hide(function () {
|
||||||
|
that.$element.off('.' + that.type).removeData('bs.' + that.type)
|
||||||
|
if (that.$tip) {
|
||||||
|
that.$tip.detach()
|
||||||
|
}
|
||||||
|
that.$tip = null
|
||||||
|
that.$arrow = null
|
||||||
|
that.$viewport = null
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TOOLTIP PLUGIN DEFINITION
|
||||||
|
// =========================
|
||||||
|
|
||||||
|
function Plugin(option) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var data = $this.data('bs.tooltip')
|
||||||
|
var options = typeof option == 'object' && option
|
||||||
|
|
||||||
|
if (!data && /destroy|hide/.test(option)) return
|
||||||
|
if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
|
||||||
|
if (typeof option == 'string') data[option]()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var old = $.fn.tooltip
|
||||||
|
|
||||||
|
$.fn.tooltip = Plugin
|
||||||
|
$.fn.tooltip.Constructor = Tooltip
|
||||||
|
|
||||||
|
|
||||||
|
// TOOLTIP NO CONFLICT
|
||||||
|
// ===================
|
||||||
|
|
||||||
|
$.fn.tooltip.noConflict = function () {
|
||||||
|
$.fn.tooltip = old
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
}(jQuery);
|
|
@ -0,0 +1,59 @@
|
||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: transition.js v3.3.6
|
||||||
|
* http://getbootstrap.com/javascript/#transitions
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
|
||||||
|
// ============================================================
|
||||||
|
|
||||||
|
function transitionEnd() {
|
||||||
|
var el = document.createElement('bootstrap')
|
||||||
|
|
||||||
|
var transEndEventNames = {
|
||||||
|
WebkitTransition : 'webkitTransitionEnd',
|
||||||
|
MozTransition : 'transitionend',
|
||||||
|
OTransition : 'oTransitionEnd otransitionend',
|
||||||
|
transition : 'transitionend'
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var name in transEndEventNames) {
|
||||||
|
if (el.style[name] !== undefined) {
|
||||||
|
return { end: transEndEventNames[name] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false // explicit for ie8 ( ._.)
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://blog.alexmaccaw.com/css-transitions
|
||||||
|
$.fn.emulateTransitionEnd = function (duration) {
|
||||||
|
var called = false
|
||||||
|
var $el = this
|
||||||
|
$(this).one('bsTransitionEnd', function () { called = true })
|
||||||
|
var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
|
||||||
|
setTimeout(callback, duration)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
$.support.transition = transitionEnd()
|
||||||
|
|
||||||
|
if (!$.support.transition) return
|
||||||
|
|
||||||
|
$.event.special.bsTransitionEnd = {
|
||||||
|
bindType: $.support.transition.end,
|
||||||
|
delegateType: $.support.transition.end,
|
||||||
|
handle: function (e) {
|
||||||
|
if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}(jQuery);
|
|
@ -0,0 +1,192 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): alert.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Alert = (function ($) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var NAME = 'alert';
|
||||||
|
var VERSION = '4.0.0-alpha';
|
||||||
|
var DATA_KEY = 'bs.alert';
|
||||||
|
var EVENT_KEY = '.' + DATA_KEY;
|
||||||
|
var DATA_API_KEY = '.data-api';
|
||||||
|
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
var TRANSITION_DURATION = 150;
|
||||||
|
|
||||||
|
var Selector = {
|
||||||
|
DISMISS: '[data-dismiss="alert"]'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Event = {
|
||||||
|
CLOSE: 'close' + EVENT_KEY,
|
||||||
|
CLOSED: 'closed' + EVENT_KEY,
|
||||||
|
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
|
||||||
|
};
|
||||||
|
|
||||||
|
var ClassName = {
|
||||||
|
ALERT: 'alert',
|
||||||
|
FADE: 'fade',
|
||||||
|
IN: 'in'
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Alert = (function () {
|
||||||
|
function Alert(element) {
|
||||||
|
_classCallCheck(this, Alert);
|
||||||
|
|
||||||
|
this._element = element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
_createClass(Alert, [{
|
||||||
|
key: 'close',
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
value: function close(element) {
|
||||||
|
element = element || this._element;
|
||||||
|
|
||||||
|
var rootElement = this._getRootElement(element);
|
||||||
|
var customEvent = this._triggerCloseEvent(rootElement);
|
||||||
|
|
||||||
|
if (customEvent.isDefaultPrevented()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._removeElement(rootElement);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'dispose',
|
||||||
|
value: function dispose() {
|
||||||
|
$.removeData(this._element, DATA_KEY);
|
||||||
|
this._element = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
}, {
|
||||||
|
key: '_getRootElement',
|
||||||
|
value: function _getRootElement(element) {
|
||||||
|
var selector = Util.getSelectorFromElement(element);
|
||||||
|
var parent = false;
|
||||||
|
|
||||||
|
if (selector) {
|
||||||
|
parent = $(selector)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!parent) {
|
||||||
|
parent = $(element).closest('.' + ClassName.ALERT)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_triggerCloseEvent',
|
||||||
|
value: function _triggerCloseEvent(element) {
|
||||||
|
var closeEvent = $.Event(Event.CLOSE);
|
||||||
|
|
||||||
|
$(element).trigger(closeEvent);
|
||||||
|
return closeEvent;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_removeElement',
|
||||||
|
value: function _removeElement(element) {
|
||||||
|
$(element).removeClass(ClassName.IN);
|
||||||
|
|
||||||
|
if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) {
|
||||||
|
this._destroyElement(element);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$(element).one(Util.TRANSITION_END, $.proxy(this._destroyElement, this, element)).emulateTransitionEnd(TRANSITION_DURATION);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_destroyElement',
|
||||||
|
value: function _destroyElement(element) {
|
||||||
|
$(element).detach().trigger(Event.CLOSED).remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
}], [{
|
||||||
|
key: '_jQueryInterface',
|
||||||
|
value: function _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $element = $(this);
|
||||||
|
var data = $element.data(DATA_KEY);
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Alert(this);
|
||||||
|
$element.data(DATA_KEY, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config === 'close') {
|
||||||
|
data[config](this);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_handleDismiss',
|
||||||
|
value: function _handleDismiss(alertInstance) {
|
||||||
|
return function (event) {
|
||||||
|
if (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
alertInstance.close(this);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'VERSION',
|
||||||
|
get: function get() {
|
||||||
|
return VERSION;
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return Alert;
|
||||||
|
})();
|
||||||
|
|
||||||
|
$(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Alert._jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Alert;
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Alert._jQueryInterface;
|
||||||
|
};
|
||||||
|
|
||||||
|
return Alert;
|
||||||
|
})(jQuery);
|
||||||
|
//# sourceMappingURL=alert.js.map
|
|
@ -0,0 +1,172 @@
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): button.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
||||||
|
|
||||||
|
var Button = (function ($) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var NAME = 'button';
|
||||||
|
var VERSION = '4.0.0-alpha';
|
||||||
|
var DATA_KEY = 'bs.button';
|
||||||
|
var EVENT_KEY = '.' + DATA_KEY;
|
||||||
|
var DATA_API_KEY = '.data-api';
|
||||||
|
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
|
||||||
|
var ClassName = {
|
||||||
|
ACTIVE: 'active',
|
||||||
|
BUTTON: 'btn',
|
||||||
|
FOCUS: 'focus'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Selector = {
|
||||||
|
DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
|
||||||
|
DATA_TOGGLE: '[data-toggle="buttons"]',
|
||||||
|
INPUT: 'input',
|
||||||
|
ACTIVE: '.active',
|
||||||
|
BUTTON: '.btn'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Event = {
|
||||||
|
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
|
||||||
|
FOCUS_BLUR_DATA_API: 'focus' + EVENT_KEY + DATA_API_KEY + ' ' + ('blur' + EVENT_KEY + DATA_API_KEY)
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Button = (function () {
|
||||||
|
function Button(element) {
|
||||||
|
_classCallCheck(this, Button);
|
||||||
|
|
||||||
|
this._element = element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
_createClass(Button, [{
|
||||||
|
key: 'toggle',
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
value: function toggle() {
|
||||||
|
var triggerChangeEvent = true;
|
||||||
|
var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];
|
||||||
|
|
||||||
|
if (rootElement) {
|
||||||
|
var input = $(this._element).find(Selector.INPUT)[0];
|
||||||
|
|
||||||
|
if (input) {
|
||||||
|
if (input.type === 'radio') {
|
||||||
|
if (input.checked && $(this._element).hasClass(ClassName.ACTIVE)) {
|
||||||
|
triggerChangeEvent = false;
|
||||||
|
} else {
|
||||||
|
var activeElement = $(rootElement).find(Selector.ACTIVE)[0];
|
||||||
|
|
||||||
|
if (activeElement) {
|
||||||
|
$(activeElement).removeClass(ClassName.ACTIVE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (triggerChangeEvent) {
|
||||||
|
input.checked = !$(this._element).hasClass(ClassName.ACTIVE);
|
||||||
|
$(this._element).trigger('change');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (triggerChangeEvent) {
|
||||||
|
$(this._element).toggleClass(ClassName.ACTIVE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'dispose',
|
||||||
|
value: function dispose() {
|
||||||
|
$.removeData(this._element, DATA_KEY);
|
||||||
|
this._element = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
}], [{
|
||||||
|
key: '_jQueryInterface',
|
||||||
|
value: function _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
var data = $(this).data(DATA_KEY);
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Button(this);
|
||||||
|
$(this).data(DATA_KEY, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config === 'toggle') {
|
||||||
|
data[config]();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'VERSION',
|
||||||
|
get: function get() {
|
||||||
|
return VERSION;
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return Button;
|
||||||
|
})();
|
||||||
|
|
||||||
|
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
var button = event.target;
|
||||||
|
|
||||||
|
if (!$(button).hasClass(ClassName.BUTTON)) {
|
||||||
|
button = $(button).closest(Selector.BUTTON);
|
||||||
|
}
|
||||||
|
|
||||||
|
Button._jQueryInterface.call($(button), 'toggle');
|
||||||
|
}).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
|
||||||
|
var button = $(event.target).closest(Selector.BUTTON)[0];
|
||||||
|
$(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Button._jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Button;
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Button._jQueryInterface;
|
||||||
|
};
|
||||||
|
|
||||||
|
return Button;
|
||||||
|
})(jQuery);
|
||||||
|
//# sourceMappingURL=button.js.map
|
|
@ -0,0 +1,478 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): carousel.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Carousel = (function ($) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var NAME = 'carousel';
|
||||||
|
var VERSION = '4.0.0-alpha';
|
||||||
|
var DATA_KEY = 'bs.carousel';
|
||||||
|
var EVENT_KEY = '.' + DATA_KEY;
|
||||||
|
var DATA_API_KEY = '.data-api';
|
||||||
|
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
var TRANSITION_DURATION = 600;
|
||||||
|
|
||||||
|
var Default = {
|
||||||
|
interval: 5000,
|
||||||
|
keyboard: true,
|
||||||
|
slide: false,
|
||||||
|
pause: 'hover',
|
||||||
|
wrap: true
|
||||||
|
};
|
||||||
|
|
||||||
|
var DefaultType = {
|
||||||
|
interval: '(number|boolean)',
|
||||||
|
keyboard: 'boolean',
|
||||||
|
slide: '(boolean|string)',
|
||||||
|
pause: '(string|boolean)',
|
||||||
|
wrap: 'boolean'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Direction = {
|
||||||
|
NEXT: 'next',
|
||||||
|
PREVIOUS: 'prev'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Event = {
|
||||||
|
SLIDE: 'slide' + EVENT_KEY,
|
||||||
|
SLID: 'slid' + EVENT_KEY,
|
||||||
|
KEYDOWN: 'keydown' + EVENT_KEY,
|
||||||
|
MOUSEENTER: 'mouseenter' + EVENT_KEY,
|
||||||
|
MOUSELEAVE: 'mouseleave' + EVENT_KEY,
|
||||||
|
LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY,
|
||||||
|
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
|
||||||
|
};
|
||||||
|
|
||||||
|
var ClassName = {
|
||||||
|
CAROUSEL: 'carousel',
|
||||||
|
ACTIVE: 'active',
|
||||||
|
SLIDE: 'slide',
|
||||||
|
RIGHT: 'right',
|
||||||
|
LEFT: 'left',
|
||||||
|
ITEM: 'carousel-item'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Selector = {
|
||||||
|
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"]'
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Carousel = (function () {
|
||||||
|
function Carousel(element, config) {
|
||||||
|
_classCallCheck(this, Carousel);
|
||||||
|
|
||||||
|
this._items = null;
|
||||||
|
this._interval = null;
|
||||||
|
this._activeElement = null;
|
||||||
|
|
||||||
|
this._isPaused = false;
|
||||||
|
this._isSliding = false;
|
||||||
|
|
||||||
|
this._config = this._getConfig(config);
|
||||||
|
this._element = $(element)[0];
|
||||||
|
this._indicatorsElement = $(this._element).find(Selector.INDICATORS)[0];
|
||||||
|
|
||||||
|
this._addEventListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
_createClass(Carousel, [{
|
||||||
|
key: 'next',
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
value: function next() {
|
||||||
|
if (!this._isSliding) {
|
||||||
|
this._slide(Direction.NEXT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'nextWhenVisible',
|
||||||
|
value: function nextWhenVisible() {
|
||||||
|
// Don't call next when the page isn't visible
|
||||||
|
if (!document.hidden) {
|
||||||
|
this.next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'prev',
|
||||||
|
value: function prev() {
|
||||||
|
if (!this._isSliding) {
|
||||||
|
this._slide(Direction.PREVIOUS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'pause',
|
||||||
|
value: function pause(event) {
|
||||||
|
if (!event) {
|
||||||
|
this._isPaused = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($(this._element).find(Selector.NEXT_PREV)[0] && Util.supportsTransitionEnd()) {
|
||||||
|
Util.triggerTransitionEnd(this._element);
|
||||||
|
this.cycle(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
clearInterval(this._interval);
|
||||||
|
this._interval = null;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'cycle',
|
||||||
|
value: function cycle(event) {
|
||||||
|
if (!event) {
|
||||||
|
this._isPaused = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._interval) {
|
||||||
|
clearInterval(this._interval);
|
||||||
|
this._interval = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._config.interval && !this._isPaused) {
|
||||||
|
this._interval = setInterval($.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'to',
|
||||||
|
value: function to(index) {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
|
||||||
|
|
||||||
|
var activeIndex = this._getItemIndex(this._activeElement);
|
||||||
|
|
||||||
|
if (index > this._items.length - 1 || index < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._isSliding) {
|
||||||
|
$(this._element).one(Event.SLID, function () {
|
||||||
|
return _this.to(index);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeIndex === index) {
|
||||||
|
this.pause();
|
||||||
|
this.cycle();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var direction = index > activeIndex ? Direction.NEXT : Direction.PREVIOUS;
|
||||||
|
|
||||||
|
this._slide(direction, this._items[index]);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'dispose',
|
||||||
|
value: function dispose() {
|
||||||
|
$(this._element).off(EVENT_KEY);
|
||||||
|
$.removeData(this._element, DATA_KEY);
|
||||||
|
|
||||||
|
this._items = null;
|
||||||
|
this._config = null;
|
||||||
|
this._element = null;
|
||||||
|
this._interval = null;
|
||||||
|
this._isPaused = null;
|
||||||
|
this._isSliding = null;
|
||||||
|
this._activeElement = null;
|
||||||
|
this._indicatorsElement = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
}, {
|
||||||
|
key: '_getConfig',
|
||||||
|
value: function _getConfig(config) {
|
||||||
|
config = $.extend({}, Default, config);
|
||||||
|
Util.typeCheckConfig(NAME, config, DefaultType);
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_addEventListeners',
|
||||||
|
value: function _addEventListeners() {
|
||||||
|
if (this._config.keyboard) {
|
||||||
|
$(this._element).on(Event.KEYDOWN, $.proxy(this._keydown, this));
|
||||||
|
}
|
||||||
|
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_keydown',
|
||||||
|
value: function _keydown(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
if (/input|textarea/i.test(event.target.tagName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (event.which) {
|
||||||
|
case 37:
|
||||||
|
this.prev();break;
|
||||||
|
case 39:
|
||||||
|
this.next();break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_getItemIndex',
|
||||||
|
value: function _getItemIndex(element) {
|
||||||
|
this._items = $.makeArray($(element).parent().find(Selector.ITEM));
|
||||||
|
return this._items.indexOf(element);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_getItemByDirection',
|
||||||
|
value: function _getItemByDirection(direction, activeElement) {
|
||||||
|
var isNextDirection = direction === Direction.NEXT;
|
||||||
|
var isPrevDirection = direction === Direction.PREVIOUS;
|
||||||
|
var activeIndex = this._getItemIndex(activeElement);
|
||||||
|
var lastItemIndex = this._items.length - 1;
|
||||||
|
var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
|
||||||
|
|
||||||
|
if (isGoingToWrap && !this._config.wrap) {
|
||||||
|
return activeElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
var delta = direction === Direction.PREVIOUS ? -1 : 1;
|
||||||
|
var itemIndex = (activeIndex + delta) % this._items.length;
|
||||||
|
|
||||||
|
return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_triggerSlideEvent',
|
||||||
|
value: function _triggerSlideEvent(relatedTarget, directionalClassname) {
|
||||||
|
var slideEvent = $.Event(Event.SLIDE, {
|
||||||
|
relatedTarget: relatedTarget,
|
||||||
|
direction: directionalClassname
|
||||||
|
});
|
||||||
|
|
||||||
|
$(this._element).trigger(slideEvent);
|
||||||
|
|
||||||
|
return slideEvent;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_setActiveIndicatorElement',
|
||||||
|
value: function _setActiveIndicatorElement(element) {
|
||||||
|
if (this._indicatorsElement) {
|
||||||
|
$(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
|
||||||
|
|
||||||
|
var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
|
||||||
|
|
||||||
|
if (nextIndicator) {
|
||||||
|
$(nextIndicator).addClass(ClassName.ACTIVE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_slide',
|
||||||
|
value: function _slide(direction, element) {
|
||||||
|
var _this2 = 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;
|
||||||
|
|
||||||
|
if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
|
||||||
|
this._isSliding = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var slideEvent = this._triggerSlideEvent(nextElement, directionalClassName);
|
||||||
|
if (slideEvent.isDefaultPrevented()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!activeElement || !nextElement) {
|
||||||
|
// some weirdness is happening, so we bail
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._isSliding = true;
|
||||||
|
|
||||||
|
if (isCycling) {
|
||||||
|
this.pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
this._setActiveIndicatorElement(nextElement);
|
||||||
|
|
||||||
|
var slidEvent = $.Event(Event.SLID, {
|
||||||
|
relatedTarget: nextElement,
|
||||||
|
direction: directionalClassName
|
||||||
|
});
|
||||||
|
|
||||||
|
if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.SLIDE)) {
|
||||||
|
|
||||||
|
$(nextElement).addClass(direction);
|
||||||
|
|
||||||
|
Util.reflow(nextElement);
|
||||||
|
|
||||||
|
$(activeElement).addClass(directionalClassName);
|
||||||
|
$(nextElement).addClass(directionalClassName);
|
||||||
|
|
||||||
|
$(activeElement).one(Util.TRANSITION_END, function () {
|
||||||
|
$(nextElement).removeClass(directionalClassName).removeClass(direction);
|
||||||
|
|
||||||
|
$(nextElement).addClass(ClassName.ACTIVE);
|
||||||
|
|
||||||
|
$(activeElement).removeClass(ClassName.ACTIVE).removeClass(direction).removeClass(directionalClassName);
|
||||||
|
|
||||||
|
_this2._isSliding = false;
|
||||||
|
|
||||||
|
setTimeout(function () {
|
||||||
|
return $(_this2._element).trigger(slidEvent);
|
||||||
|
}, 0);
|
||||||
|
}).emulateTransitionEnd(TRANSITION_DURATION);
|
||||||
|
} else {
|
||||||
|
$(activeElement).removeClass(ClassName.ACTIVE);
|
||||||
|
$(nextElement).addClass(ClassName.ACTIVE);
|
||||||
|
|
||||||
|
this._isSliding = false;
|
||||||
|
$(this._element).trigger(slidEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isCycling) {
|
||||||
|
this.cycle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
}], [{
|
||||||
|
key: '_jQueryInterface',
|
||||||
|
value: function _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
var data = $(this).data(DATA_KEY);
|
||||||
|
var _config = $.extend({}, Default, $(this).data());
|
||||||
|
|
||||||
|
if (typeof config === 'object') {
|
||||||
|
$.extend(_config, config);
|
||||||
|
}
|
||||||
|
|
||||||
|
var action = typeof config === 'string' ? config : _config.slide;
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Carousel(this, _config);
|
||||||
|
$(this).data(DATA_KEY, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'number') {
|
||||||
|
data.to(config);
|
||||||
|
} else if (typeof action === 'string') {
|
||||||
|
if (data[action] === undefined) {
|
||||||
|
throw new Error('No method named "' + action + '"');
|
||||||
|
}
|
||||||
|
data[action]();
|
||||||
|
} else if (_config.interval) {
|
||||||
|
data.pause();
|
||||||
|
data.cycle();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_dataApiClickHandler',
|
||||||
|
value: function _dataApiClickHandler(event) {
|
||||||
|
var selector = Util.getSelectorFromElement(this);
|
||||||
|
|
||||||
|
if (!selector) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var target = $(selector)[0];
|
||||||
|
|
||||||
|
if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var config = $.extend({}, $(target).data(), $(this).data());
|
||||||
|
var slideIndex = this.getAttribute('data-slide-to');
|
||||||
|
|
||||||
|
if (slideIndex) {
|
||||||
|
config.interval = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Carousel._jQueryInterface.call($(target), config);
|
||||||
|
|
||||||
|
if (slideIndex) {
|
||||||
|
$(target).data(DATA_KEY).to(slideIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'VERSION',
|
||||||
|
get: function get() {
|
||||||
|
return VERSION;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'Default',
|
||||||
|
get: function get() {
|
||||||
|
return Default;
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return Carousel;
|
||||||
|
})();
|
||||||
|
|
||||||
|
$(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);
|
||||||
|
|
||||||
|
$(window).on(Event.LOAD_DATA_API, function () {
|
||||||
|
$(Selector.DATA_RIDE).each(function () {
|
||||||
|
var $carousel = $(this);
|
||||||
|
Carousel._jQueryInterface.call($carousel, $carousel.data());
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Carousel._jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Carousel;
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Carousel._jQueryInterface;
|
||||||
|
};
|
||||||
|
|
||||||
|
return Carousel;
|
||||||
|
})(jQuery);
|
||||||
|
//# sourceMappingURL=carousel.js.map
|
|
@ -0,0 +1,364 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): collapse.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Collapse = (function ($) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var NAME = 'collapse';
|
||||||
|
var VERSION = '4.0.0-alpha';
|
||||||
|
var DATA_KEY = 'bs.collapse';
|
||||||
|
var EVENT_KEY = '.' + DATA_KEY;
|
||||||
|
var DATA_API_KEY = '.data-api';
|
||||||
|
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
var TRANSITION_DURATION = 600;
|
||||||
|
|
||||||
|
var Default = {
|
||||||
|
toggle: true,
|
||||||
|
parent: ''
|
||||||
|
};
|
||||||
|
|
||||||
|
var DefaultType = {
|
||||||
|
toggle: 'boolean',
|
||||||
|
parent: 'string'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Event = {
|
||||||
|
SHOW: 'show' + EVENT_KEY,
|
||||||
|
SHOWN: 'shown' + EVENT_KEY,
|
||||||
|
HIDE: 'hide' + EVENT_KEY,
|
||||||
|
HIDDEN: 'hidden' + EVENT_KEY,
|
||||||
|
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
|
||||||
|
};
|
||||||
|
|
||||||
|
var ClassName = {
|
||||||
|
IN: 'in',
|
||||||
|
COLLAPSE: 'collapse',
|
||||||
|
COLLAPSING: 'collapsing',
|
||||||
|
COLLAPSED: 'collapsed'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Dimension = {
|
||||||
|
WIDTH: 'width',
|
||||||
|
HEIGHT: 'height'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Selector = {
|
||||||
|
ACTIVES: '.panel > .in, .panel > .collapsing',
|
||||||
|
DATA_TOGGLE: '[data-toggle="collapse"]'
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Collapse = (function () {
|
||||||
|
function Collapse(element, config) {
|
||||||
|
_classCallCheck(this, Collapse);
|
||||||
|
|
||||||
|
this._isTransitioning = false;
|
||||||
|
this._element = element;
|
||||||
|
this._config = this._getConfig(config);
|
||||||
|
this._triggerArray = $.makeArray($('[data-toggle="collapse"][href="#' + element.id + '"],' + ('[data-toggle="collapse"][data-target="#' + element.id + '"]')));
|
||||||
|
|
||||||
|
this._parent = this._config.parent ? this._getParent() : null;
|
||||||
|
|
||||||
|
if (!this._config.parent) {
|
||||||
|
this._addAriaAndCollapsedClass(this._element, this._triggerArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._config.toggle) {
|
||||||
|
this.toggle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
_createClass(Collapse, [{
|
||||||
|
key: 'toggle',
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
value: function toggle() {
|
||||||
|
if ($(this._element).hasClass(ClassName.IN)) {
|
||||||
|
this.hide();
|
||||||
|
} else {
|
||||||
|
this.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'show',
|
||||||
|
value: function show() {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
if (this._isTransitioning || $(this._element).hasClass(ClassName.IN)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var actives = undefined;
|
||||||
|
var activesData = undefined;
|
||||||
|
|
||||||
|
if (this._parent) {
|
||||||
|
actives = $.makeArray($(Selector.ACTIVES));
|
||||||
|
if (!actives.length) {
|
||||||
|
actives = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (actives) {
|
||||||
|
activesData = $(actives).data(DATA_KEY);
|
||||||
|
if (activesData && activesData._isTransitioning) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var startEvent = $.Event(Event.SHOW);
|
||||||
|
$(this._element).trigger(startEvent);
|
||||||
|
if (startEvent.isDefaultPrevented()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (actives) {
|
||||||
|
Collapse._jQueryInterface.call($(actives), 'hide');
|
||||||
|
if (!activesData) {
|
||||||
|
$(actives).data(DATA_KEY, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var dimension = this._getDimension();
|
||||||
|
|
||||||
|
$(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
|
||||||
|
|
||||||
|
this._element.style[dimension] = 0;
|
||||||
|
this._element.setAttribute('aria-expanded', true);
|
||||||
|
|
||||||
|
if (this._triggerArray.length) {
|
||||||
|
$(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setTransitioning(true);
|
||||||
|
|
||||||
|
var complete = function complete() {
|
||||||
|
$(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.IN);
|
||||||
|
|
||||||
|
_this._element.style[dimension] = '';
|
||||||
|
|
||||||
|
_this.setTransitioning(false);
|
||||||
|
|
||||||
|
$(_this._element).trigger(Event.SHOWN);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!Util.supportsTransitionEnd()) {
|
||||||
|
complete();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
|
||||||
|
var scrollSize = 'scroll' + capitalizedDimension;
|
||||||
|
|
||||||
|
$(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
|
||||||
|
|
||||||
|
this._element.style[dimension] = this._element[scrollSize] + 'px';
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'hide',
|
||||||
|
value: function hide() {
|
||||||
|
var _this2 = this;
|
||||||
|
|
||||||
|
if (this._isTransitioning || !$(this._element).hasClass(ClassName.IN)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var startEvent = $.Event(Event.HIDE);
|
||||||
|
$(this._element).trigger(startEvent);
|
||||||
|
if (startEvent.isDefaultPrevented()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var dimension = this._getDimension();
|
||||||
|
var offsetDimension = dimension === Dimension.WIDTH ? 'offsetWidth' : 'offsetHeight';
|
||||||
|
|
||||||
|
this._element.style[dimension] = this._element[offsetDimension] + 'px';
|
||||||
|
|
||||||
|
Util.reflow(this._element);
|
||||||
|
|
||||||
|
$(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.IN);
|
||||||
|
|
||||||
|
this._element.setAttribute('aria-expanded', false);
|
||||||
|
|
||||||
|
if (this._triggerArray.length) {
|
||||||
|
$(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setTransitioning(true);
|
||||||
|
|
||||||
|
var complete = function complete() {
|
||||||
|
_this2.setTransitioning(false);
|
||||||
|
$(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
|
||||||
|
};
|
||||||
|
|
||||||
|
this._element.style[dimension] = 0;
|
||||||
|
|
||||||
|
if (!Util.supportsTransitionEnd()) {
|
||||||
|
complete();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'setTransitioning',
|
||||||
|
value: function setTransitioning(isTransitioning) {
|
||||||
|
this._isTransitioning = isTransitioning;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'dispose',
|
||||||
|
value: function dispose() {
|
||||||
|
$.removeData(this._element, DATA_KEY);
|
||||||
|
|
||||||
|
this._config = null;
|
||||||
|
this._parent = null;
|
||||||
|
this._element = null;
|
||||||
|
this._triggerArray = null;
|
||||||
|
this._isTransitioning = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
}, {
|
||||||
|
key: '_getConfig',
|
||||||
|
value: function _getConfig(config) {
|
||||||
|
config = $.extend({}, Default, config);
|
||||||
|
config.toggle = Boolean(config.toggle); // coerce string values
|
||||||
|
Util.typeCheckConfig(NAME, config, DefaultType);
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_getDimension',
|
||||||
|
value: function _getDimension() {
|
||||||
|
var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
|
||||||
|
return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_getParent',
|
||||||
|
value: function _getParent() {
|
||||||
|
var _this3 = this;
|
||||||
|
|
||||||
|
var parent = $(this._config.parent)[0];
|
||||||
|
var selector = '[data-toggle="collapse"][data-parent="' + this._config.parent + '"]';
|
||||||
|
|
||||||
|
$(parent).find(selector).each(function (i, element) {
|
||||||
|
_this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
|
||||||
|
});
|
||||||
|
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_addAriaAndCollapsedClass',
|
||||||
|
value: function _addAriaAndCollapsedClass(element, triggerArray) {
|
||||||
|
if (element) {
|
||||||
|
var isOpen = $(element).hasClass(ClassName.IN);
|
||||||
|
element.setAttribute('aria-expanded', isOpen);
|
||||||
|
|
||||||
|
if (triggerArray.length) {
|
||||||
|
$(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
}], [{
|
||||||
|
key: '_getTargetFromElement',
|
||||||
|
value: function _getTargetFromElement(element) {
|
||||||
|
var selector = Util.getSelectorFromElement(element);
|
||||||
|
return selector ? $(selector)[0] : null;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_jQueryInterface',
|
||||||
|
value: function _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this);
|
||||||
|
var data = $this.data(DATA_KEY);
|
||||||
|
var _config = $.extend({}, Default, $this.data(), typeof config === 'object' && config);
|
||||||
|
|
||||||
|
if (!data && _config.toggle && /show|hide/.test(config)) {
|
||||||
|
_config.toggle = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Collapse(this, _config);
|
||||||
|
$this.data(DATA_KEY, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error('No method named "' + config + '"');
|
||||||
|
}
|
||||||
|
data[config]();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'VERSION',
|
||||||
|
get: function get() {
|
||||||
|
return VERSION;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'Default',
|
||||||
|
get: function get() {
|
||||||
|
return Default;
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return Collapse;
|
||||||
|
})();
|
||||||
|
|
||||||
|
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
var target = Collapse._getTargetFromElement(this);
|
||||||
|
var data = $(target).data(DATA_KEY);
|
||||||
|
var config = data ? 'toggle' : $(this).data();
|
||||||
|
|
||||||
|
Collapse._jQueryInterface.call($(target), config);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Collapse._jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Collapse;
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Collapse._jQueryInterface;
|
||||||
|
};
|
||||||
|
|
||||||
|
return Collapse;
|
||||||
|
})(jQuery);
|
||||||
|
//# sourceMappingURL=collapse.js.map
|
|
@ -0,0 +1,293 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): dropdown.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Dropdown = (function ($) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var NAME = 'dropdown';
|
||||||
|
var VERSION = '4.0.0-alpha';
|
||||||
|
var DATA_KEY = 'bs.dropdown';
|
||||||
|
var EVENT_KEY = '.' + DATA_KEY;
|
||||||
|
var DATA_API_KEY = '.data-api';
|
||||||
|
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
|
||||||
|
var Event = {
|
||||||
|
HIDE: 'hide' + EVENT_KEY,
|
||||||
|
HIDDEN: 'hidden' + EVENT_KEY,
|
||||||
|
SHOW: 'show' + EVENT_KEY,
|
||||||
|
SHOWN: 'shown' + EVENT_KEY,
|
||||||
|
CLICK: 'click' + EVENT_KEY,
|
||||||
|
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
|
||||||
|
KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY
|
||||||
|
};
|
||||||
|
|
||||||
|
var ClassName = {
|
||||||
|
BACKDROP: 'dropdown-backdrop',
|
||||||
|
DISABLED: 'disabled',
|
||||||
|
OPEN: 'open'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Selector = {
|
||||||
|
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'
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Dropdown = (function () {
|
||||||
|
function Dropdown(element) {
|
||||||
|
_classCallCheck(this, Dropdown);
|
||||||
|
|
||||||
|
this._element = element;
|
||||||
|
|
||||||
|
this._addEventListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
_createClass(Dropdown, [{
|
||||||
|
key: 'toggle',
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
value: function toggle() {
|
||||||
|
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var parent = Dropdown._getParentFromElement(this);
|
||||||
|
var isActive = $(parent).hasClass(ClassName.OPEN);
|
||||||
|
|
||||||
|
Dropdown._clearMenus();
|
||||||
|
|
||||||
|
if (isActive) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) {
|
||||||
|
|
||||||
|
// if mobile we use a backdrop because click events don't delegate
|
||||||
|
var dropdown = document.createElement('div');
|
||||||
|
dropdown.className = ClassName.BACKDROP;
|
||||||
|
$(dropdown).insertBefore(this);
|
||||||
|
$(dropdown).on('click', Dropdown._clearMenus);
|
||||||
|
}
|
||||||
|
|
||||||
|
var relatedTarget = { relatedTarget: this };
|
||||||
|
var showEvent = $.Event(Event.SHOW, relatedTarget);
|
||||||
|
|
||||||
|
$(parent).trigger(showEvent);
|
||||||
|
|
||||||
|
if (showEvent.isDefaultPrevented()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.focus();
|
||||||
|
this.setAttribute('aria-expanded', 'true');
|
||||||
|
|
||||||
|
$(parent).toggleClass(ClassName.OPEN);
|
||||||
|
$(parent).trigger($.Event(Event.SHOWN, relatedTarget));
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'dispose',
|
||||||
|
value: function dispose() {
|
||||||
|
$.removeData(this._element, DATA_KEY);
|
||||||
|
$(this._element).off(EVENT_KEY);
|
||||||
|
this._element = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
}, {
|
||||||
|
key: '_addEventListeners',
|
||||||
|
value: function _addEventListeners() {
|
||||||
|
$(this._element).on(Event.CLICK, this.toggle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
}], [{
|
||||||
|
key: '_jQueryInterface',
|
||||||
|
value: function _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
var data = $(this).data(DATA_KEY);
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
$(this).data(DATA_KEY, data = new Dropdown(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error('No method named "' + config + '"');
|
||||||
|
}
|
||||||
|
data[config].call(this);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_clearMenus',
|
||||||
|
value: function _clearMenus(event) {
|
||||||
|
if (event && event.which === 3) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var backdrop = $(Selector.BACKDROP)[0];
|
||||||
|
if (backdrop) {
|
||||||
|
backdrop.parentNode.removeChild(backdrop);
|
||||||
|
}
|
||||||
|
|
||||||
|
var toggles = $.makeArray($(Selector.DATA_TOGGLE));
|
||||||
|
|
||||||
|
for (var i = 0; i < toggles.length; i++) {
|
||||||
|
var _parent = Dropdown._getParentFromElement(toggles[i]);
|
||||||
|
var relatedTarget = { relatedTarget: toggles[i] };
|
||||||
|
|
||||||
|
if (!$(_parent).hasClass(ClassName.OPEN)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event && event.type === 'click' && /input|textarea/i.test(event.target.tagName) && $.contains(_parent, event.target)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var hideEvent = $.Event(Event.HIDE, relatedTarget);
|
||||||
|
$(_parent).trigger(hideEvent);
|
||||||
|
if (hideEvent.isDefaultPrevented()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
toggles[i].setAttribute('aria-expanded', 'false');
|
||||||
|
|
||||||
|
$(_parent).removeClass(ClassName.OPEN).trigger($.Event(Event.HIDDEN, relatedTarget));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_getParentFromElement',
|
||||||
|
value: function _getParentFromElement(element) {
|
||||||
|
var parent = undefined;
|
||||||
|
var selector = Util.getSelectorFromElement(element);
|
||||||
|
|
||||||
|
if (selector) {
|
||||||
|
parent = $(selector)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent || element.parentNode;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_dataApiKeydownHandler',
|
||||||
|
value: function _dataApiKeydownHandler(event) {
|
||||||
|
if (!/(38|40|27|32)/.test(event.which) || /input|textarea/i.test(event.target.tagName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var parent = Dropdown._getParentFromElement(this);
|
||||||
|
var isActive = $(parent).hasClass(ClassName.OPEN);
|
||||||
|
|
||||||
|
if (!isActive && event.which !== 27 || isActive && event.which === 27) {
|
||||||
|
|
||||||
|
if (event.which === 27) {
|
||||||
|
var toggle = $(parent).find(Selector.DATA_TOGGLE)[0];
|
||||||
|
$(toggle).trigger('focus');
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this).trigger('click');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var items = $.makeArray($(Selector.VISIBLE_ITEMS));
|
||||||
|
|
||||||
|
items = items.filter(function (item) {
|
||||||
|
return item.offsetWidth || item.offsetHeight;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!items.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var index = items.indexOf(event.target);
|
||||||
|
|
||||||
|
if (event.which === 38 && index > 0) {
|
||||||
|
// up
|
||||||
|
index--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.which === 40 && index < items.length - 1) {
|
||||||
|
// down
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! ~index) {
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
items[index].focus();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'VERSION',
|
||||||
|
get: function get() {
|
||||||
|
return VERSION;
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return Dropdown;
|
||||||
|
})();
|
||||||
|
|
||||||
|
$(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) {
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Dropdown._jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Dropdown;
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Dropdown._jQueryInterface;
|
||||||
|
};
|
||||||
|
|
||||||
|
return Dropdown;
|
||||||
|
})(jQuery);
|
||||||
|
//# sourceMappingURL=dropdown.js.map
|
|
@ -0,0 +1,536 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): modal.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Modal = (function ($) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var NAME = 'modal';
|
||||||
|
var VERSION = '4.0.0-alpha';
|
||||||
|
var DATA_KEY = 'bs.modal';
|
||||||
|
var EVENT_KEY = '.' + DATA_KEY;
|
||||||
|
var DATA_API_KEY = '.data-api';
|
||||||
|
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
var TRANSITION_DURATION = 300;
|
||||||
|
var BACKDROP_TRANSITION_DURATION = 150;
|
||||||
|
|
||||||
|
var Default = {
|
||||||
|
backdrop: true,
|
||||||
|
keyboard: true,
|
||||||
|
focus: true,
|
||||||
|
show: true
|
||||||
|
};
|
||||||
|
|
||||||
|
var DefaultType = {
|
||||||
|
backdrop: '(boolean|string)',
|
||||||
|
keyboard: 'boolean',
|
||||||
|
focus: 'boolean',
|
||||||
|
show: 'boolean'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Event = {
|
||||||
|
HIDE: 'hide' + EVENT_KEY,
|
||||||
|
HIDDEN: 'hidden' + EVENT_KEY,
|
||||||
|
SHOW: 'show' + EVENT_KEY,
|
||||||
|
SHOWN: 'shown' + EVENT_KEY,
|
||||||
|
FOCUSIN: 'focusin' + EVENT_KEY,
|
||||||
|
RESIZE: 'resize' + EVENT_KEY,
|
||||||
|
CLICK_DISMISS: 'click.dismiss' + EVENT_KEY,
|
||||||
|
KEYDOWN_DISMISS: 'keydown.dismiss' + EVENT_KEY,
|
||||||
|
MOUSEUP_DISMISS: 'mouseup.dismiss' + EVENT_KEY,
|
||||||
|
MOUSEDOWN_DISMISS: 'mousedown.dismiss' + EVENT_KEY,
|
||||||
|
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
|
||||||
|
};
|
||||||
|
|
||||||
|
var ClassName = {
|
||||||
|
SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
|
||||||
|
BACKDROP: 'modal-backdrop',
|
||||||
|
OPEN: 'modal-open',
|
||||||
|
FADE: 'fade',
|
||||||
|
IN: 'in'
|
||||||
|
};
|
||||||
|
|
||||||
|
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'
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Modal = (function () {
|
||||||
|
function Modal(element, config) {
|
||||||
|
_classCallCheck(this, Modal);
|
||||||
|
|
||||||
|
this._config = this._getConfig(config);
|
||||||
|
this._element = element;
|
||||||
|
this._dialog = $(element).find(Selector.DIALOG)[0];
|
||||||
|
this._backdrop = null;
|
||||||
|
this._isShown = false;
|
||||||
|
this._isBodyOverflowing = false;
|
||||||
|
this._ignoreBackdropClick = false;
|
||||||
|
this._originalBodyPadding = 0;
|
||||||
|
this._scrollbarWidth = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
_createClass(Modal, [{
|
||||||
|
key: 'toggle',
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
value: function toggle(relatedTarget) {
|
||||||
|
return this._isShown ? this.hide() : this.show(relatedTarget);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'show',
|
||||||
|
value: function show(relatedTarget) {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
var showEvent = $.Event(Event.SHOW, {
|
||||||
|
relatedTarget: relatedTarget
|
||||||
|
});
|
||||||
|
|
||||||
|
$(this._element).trigger(showEvent);
|
||||||
|
|
||||||
|
if (this._isShown || showEvent.isDefaultPrevented()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._isShown = true;
|
||||||
|
|
||||||
|
this._checkScrollbar();
|
||||||
|
this._setScrollbar();
|
||||||
|
|
||||||
|
$(document.body).addClass(ClassName.OPEN);
|
||||||
|
|
||||||
|
this._setEscapeEvent();
|
||||||
|
this._setResizeEvent();
|
||||||
|
|
||||||
|
$(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, $.proxy(this.hide, this));
|
||||||
|
|
||||||
|
$(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
|
||||||
|
$(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
|
||||||
|
if ($(event.target).is(_this._element)) {
|
||||||
|
_this._ignoreBackdropClick = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
this._showBackdrop($.proxy(this._showElement, this, relatedTarget));
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'hide',
|
||||||
|
value: function hide(event) {
|
||||||
|
if (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
var hideEvent = $.Event(Event.HIDE);
|
||||||
|
|
||||||
|
$(this._element).trigger(hideEvent);
|
||||||
|
|
||||||
|
if (!this._isShown || hideEvent.isDefaultPrevented()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._isShown = false;
|
||||||
|
|
||||||
|
this._setEscapeEvent();
|
||||||
|
this._setResizeEvent();
|
||||||
|
|
||||||
|
$(document).off(Event.FOCUSIN);
|
||||||
|
|
||||||
|
$(this._element).removeClass(ClassName.IN);
|
||||||
|
|
||||||
|
$(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);
|
||||||
|
} else {
|
||||||
|
this._hideModal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'dispose',
|
||||||
|
value: 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);
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
}, {
|
||||||
|
key: '_getConfig',
|
||||||
|
value: function _getConfig(config) {
|
||||||
|
config = $.extend({}, Default, config);
|
||||||
|
Util.typeCheckConfig(NAME, config, DefaultType);
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_showElement',
|
||||||
|
value: function _showElement(relatedTarget) {
|
||||||
|
var _this2 = this;
|
||||||
|
|
||||||
|
var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
|
||||||
|
|
||||||
|
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
|
||||||
|
// don't move modals dom position
|
||||||
|
document.body.appendChild(this._element);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._element.style.display = 'block';
|
||||||
|
this._element.scrollTop = 0;
|
||||||
|
|
||||||
|
if (transition) {
|
||||||
|
Util.reflow(this._element);
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._element).addClass(ClassName.IN);
|
||||||
|
|
||||||
|
if (this._config.focus) {
|
||||||
|
this._enforceFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
var shownEvent = $.Event(Event.SHOWN, {
|
||||||
|
relatedTarget: relatedTarget
|
||||||
|
});
|
||||||
|
|
||||||
|
var transitionComplete = function transitionComplete() {
|
||||||
|
if (_this2._config.focus) {
|
||||||
|
_this2._element.focus();
|
||||||
|
}
|
||||||
|
$(_this2._element).trigger(shownEvent);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (transition) {
|
||||||
|
$(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);
|
||||||
|
} else {
|
||||||
|
transitionComplete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_enforceFocus',
|
||||||
|
value: function _enforceFocus() {
|
||||||
|
var _this3 = this;
|
||||||
|
|
||||||
|
$(document).off(Event.FOCUSIN) // guard against infinite focus loop
|
||||||
|
.on(Event.FOCUSIN, function (event) {
|
||||||
|
if (_this3._element !== event.target && !$(_this3._element).has(event.target).length) {
|
||||||
|
_this3._element.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_setEscapeEvent',
|
||||||
|
value: function _setEscapeEvent() {
|
||||||
|
var _this4 = this;
|
||||||
|
|
||||||
|
if (this._isShown && this._config.keyboard) {
|
||||||
|
$(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
|
||||||
|
if (event.which === 27) {
|
||||||
|
_this4.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (!this._isShown) {
|
||||||
|
$(this._element).off(Event.KEYDOWN_DISMISS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_setResizeEvent',
|
||||||
|
value: function _setResizeEvent() {
|
||||||
|
if (this._isShown) {
|
||||||
|
$(window).on(Event.RESIZE, $.proxy(this._handleUpdate, this));
|
||||||
|
} else {
|
||||||
|
$(window).off(Event.RESIZE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_hideModal',
|
||||||
|
value: function _hideModal() {
|
||||||
|
var _this5 = this;
|
||||||
|
|
||||||
|
this._element.style.display = 'none';
|
||||||
|
this._showBackdrop(function () {
|
||||||
|
$(document.body).removeClass(ClassName.OPEN);
|
||||||
|
_this5._resetAdjustments();
|
||||||
|
_this5._resetScrollbar();
|
||||||
|
$(_this5._element).trigger(Event.HIDDEN);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_removeBackdrop',
|
||||||
|
value: function _removeBackdrop() {
|
||||||
|
if (this._backdrop) {
|
||||||
|
$(this._backdrop).remove();
|
||||||
|
this._backdrop = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_showBackdrop',
|
||||||
|
value: function _showBackdrop(callback) {
|
||||||
|
var _this6 = this;
|
||||||
|
|
||||||
|
var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
|
||||||
|
|
||||||
|
if (this._isShown && this._config.backdrop) {
|
||||||
|
var doAnimate = Util.supportsTransitionEnd() && animate;
|
||||||
|
|
||||||
|
this._backdrop = document.createElement('div');
|
||||||
|
this._backdrop.className = ClassName.BACKDROP;
|
||||||
|
|
||||||
|
if (animate) {
|
||||||
|
$(this._backdrop).addClass(animate);
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._backdrop).appendTo(document.body);
|
||||||
|
|
||||||
|
$(this._element).on(Event.CLICK_DISMISS, function (event) {
|
||||||
|
if (_this6._ignoreBackdropClick) {
|
||||||
|
_this6._ignoreBackdropClick = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (event.target !== event.currentTarget) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (_this6._config.backdrop === 'static') {
|
||||||
|
_this6._element.focus();
|
||||||
|
} else {
|
||||||
|
_this6.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (doAnimate) {
|
||||||
|
Util.reflow(this._backdrop);
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._backdrop).addClass(ClassName.IN);
|
||||||
|
|
||||||
|
if (!callback) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!doAnimate) {
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
|
||||||
|
} else if (!this._isShown && this._backdrop) {
|
||||||
|
$(this._backdrop).removeClass(ClassName.IN);
|
||||||
|
|
||||||
|
var callbackRemove = function callbackRemove() {
|
||||||
|
_this6._removeBackdrop();
|
||||||
|
if (callback) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
|
||||||
|
$(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
|
||||||
|
} else {
|
||||||
|
callbackRemove();
|
||||||
|
}
|
||||||
|
} else if (callback) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
// the following methods are used to handle overflowing modals
|
||||||
|
// todo (fat): these should probably be refactored out of modal.js
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
}, {
|
||||||
|
key: '_handleUpdate',
|
||||||
|
value: function _handleUpdate() {
|
||||||
|
this._adjustDialog();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_adjustDialog',
|
||||||
|
value: function _adjustDialog() {
|
||||||
|
var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
||||||
|
|
||||||
|
if (!this._isBodyOverflowing && isModalOverflowing) {
|
||||||
|
this._element.style.paddingLeft = this._scrollbarWidth + 'px';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._isBodyOverflowing && !isModalOverflowing) {
|
||||||
|
this._element.style.paddingRight = this._scrollbarWidth + 'px~';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_resetAdjustments',
|
||||||
|
value: function _resetAdjustments() {
|
||||||
|
this._element.style.paddingLeft = '';
|
||||||
|
this._element.style.paddingRight = '';
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_checkScrollbar',
|
||||||
|
value: function _checkScrollbar() {
|
||||||
|
var fullWindowWidth = window.innerWidth;
|
||||||
|
if (!fullWindowWidth) {
|
||||||
|
// workaround for missing window.innerWidth in IE8
|
||||||
|
var documentElementRect = document.documentElement.getBoundingClientRect();
|
||||||
|
fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left);
|
||||||
|
}
|
||||||
|
this._isBodyOverflowing = document.body.clientWidth < fullWindowWidth;
|
||||||
|
this._scrollbarWidth = this._getScrollbarWidth();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_setScrollbar',
|
||||||
|
value: function _setScrollbar() {
|
||||||
|
var bodyPadding = parseInt($(Selector.FIXED_CONTENT).css('padding-right') || 0, 10);
|
||||||
|
|
||||||
|
this._originalBodyPadding = document.body.style.paddingRight || '';
|
||||||
|
|
||||||
|
if (this._isBodyOverflowing) {
|
||||||
|
document.body.style.paddingRight = bodyPadding + this._scrollbarWidth + 'px';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_resetScrollbar',
|
||||||
|
value: function _resetScrollbar() {
|
||||||
|
document.body.style.paddingRight = this._originalBodyPadding;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_getScrollbarWidth',
|
||||||
|
value: function _getScrollbarWidth() {
|
||||||
|
// thx d.walsh
|
||||||
|
var scrollDiv = document.createElement('div');
|
||||||
|
scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
|
||||||
|
document.body.appendChild(scrollDiv);
|
||||||
|
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
|
||||||
|
document.body.removeChild(scrollDiv);
|
||||||
|
return scrollbarWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
}], [{
|
||||||
|
key: '_jQueryInterface',
|
||||||
|
value: function _jQueryInterface(config, relatedTarget) {
|
||||||
|
return this.each(function () {
|
||||||
|
var data = $(this).data(DATA_KEY);
|
||||||
|
var _config = $.extend({}, Modal.Default, $(this).data(), typeof config === 'object' && config);
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Modal(this, _config);
|
||||||
|
$(this).data(DATA_KEY, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error('No method named "' + config + '"');
|
||||||
|
}
|
||||||
|
data[config](relatedTarget);
|
||||||
|
} else if (_config.show) {
|
||||||
|
data.show(relatedTarget);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'VERSION',
|
||||||
|
get: function get() {
|
||||||
|
return VERSION;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'Default',
|
||||||
|
get: function get() {
|
||||||
|
return Default;
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return Modal;
|
||||||
|
})();
|
||||||
|
|
||||||
|
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
||||||
|
var _this7 = this;
|
||||||
|
|
||||||
|
var target = undefined;
|
||||||
|
var selector = Util.getSelectorFromElement(this);
|
||||||
|
|
||||||
|
if (selector) {
|
||||||
|
target = $(selector)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data());
|
||||||
|
|
||||||
|
if (this.tagName === 'A') {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
var $target = $(target).one(Event.SHOW, function (showEvent) {
|
||||||
|
if (showEvent.isDefaultPrevented()) {
|
||||||
|
// only register focus restorer if modal will actually get shown
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$target.one(Event.HIDDEN, function () {
|
||||||
|
if ($(_this7).is(':visible')) {
|
||||||
|
_this7.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
Modal._jQueryInterface.call($(target), config, this);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Modal._jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Modal;
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Modal._jQueryInterface;
|
||||||
|
};
|
||||||
|
|
||||||
|
return Modal;
|
||||||
|
})(jQuery);
|
||||||
|
//# sourceMappingURL=modal.js.map
|
|
@ -0,0 +1,201 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
||||||
|
|
||||||
|
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
||||||
|
|
||||||
|
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): popover.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Popover = (function ($) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var NAME = 'popover';
|
||||||
|
var VERSION = '4.0.0-alpha';
|
||||||
|
var DATA_KEY = 'bs.popover';
|
||||||
|
var EVENT_KEY = '.' + DATA_KEY;
|
||||||
|
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
|
||||||
|
var Default = $.extend({}, Tooltip.Default, {
|
||||||
|
placement: 'right',
|
||||||
|
trigger: 'click',
|
||||||
|
content: '',
|
||||||
|
template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-title"></h3>' + '<div class="popover-content"></div></div>'
|
||||||
|
});
|
||||||
|
|
||||||
|
var DefaultType = $.extend({}, Tooltip.DefaultType, {
|
||||||
|
content: '(string|element|function)'
|
||||||
|
});
|
||||||
|
|
||||||
|
var ClassName = {
|
||||||
|
FADE: 'fade',
|
||||||
|
IN: 'in'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Selector = {
|
||||||
|
TITLE: '.popover-title',
|
||||||
|
CONTENT: '.popover-content',
|
||||||
|
ARROW: '.popover-arrow'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Event = {
|
||||||
|
HIDE: 'hide' + EVENT_KEY,
|
||||||
|
HIDDEN: 'hidden' + EVENT_KEY,
|
||||||
|
SHOW: 'show' + EVENT_KEY,
|
||||||
|
SHOWN: 'shown' + EVENT_KEY,
|
||||||
|
INSERTED: 'inserted' + EVENT_KEY,
|
||||||
|
CLICK: 'click' + EVENT_KEY,
|
||||||
|
FOCUSIN: 'focusin' + EVENT_KEY,
|
||||||
|
FOCUSOUT: 'focusout' + EVENT_KEY,
|
||||||
|
MOUSEENTER: 'mouseenter' + EVENT_KEY,
|
||||||
|
MOUSELEAVE: 'mouseleave' + EVENT_KEY
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Popover = (function (_Tooltip) {
|
||||||
|
_inherits(Popover, _Tooltip);
|
||||||
|
|
||||||
|
function Popover() {
|
||||||
|
_classCallCheck(this, Popover);
|
||||||
|
|
||||||
|
_get(Object.getPrototypeOf(Popover.prototype), 'constructor', this).apply(this, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
_createClass(Popover, [{
|
||||||
|
key: 'isWithContent',
|
||||||
|
|
||||||
|
// overrides
|
||||||
|
|
||||||
|
value: function isWithContent() {
|
||||||
|
return this.getTitle() || this._getContent();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'getTipElement',
|
||||||
|
value: function getTipElement() {
|
||||||
|
return this.tip = this.tip || $(this.config.template)[0];
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'setContent',
|
||||||
|
value: function setContent() {
|
||||||
|
var $tip = $(this.getTipElement());
|
||||||
|
|
||||||
|
// we use append for html objects to maintain js events
|
||||||
|
this.setElementContent($tip.find(Selector.TITLE), this.getTitle());
|
||||||
|
this.setElementContent($tip.find(Selector.CONTENT), this._getContent());
|
||||||
|
|
||||||
|
$tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);
|
||||||
|
|
||||||
|
this.cleanupTether();
|
||||||
|
}
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
}, {
|
||||||
|
key: '_getContent',
|
||||||
|
value: function _getContent() {
|
||||||
|
return this.element.getAttribute('data-content') || (typeof this.config.content === 'function' ? this.config.content.call(this.element) : this.config.content);
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
}], [{
|
||||||
|
key: '_jQueryInterface',
|
||||||
|
value: function _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
var data = $(this).data(DATA_KEY);
|
||||||
|
var _config = typeof config === 'object' ? config : null;
|
||||||
|
|
||||||
|
if (!data && /destroy|hide/.test(config)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Popover(this, _config);
|
||||||
|
$(this).data(DATA_KEY, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error('No method named "' + config + '"');
|
||||||
|
}
|
||||||
|
data[config]();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'VERSION',
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
get: function get() {
|
||||||
|
return VERSION;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'Default',
|
||||||
|
get: function get() {
|
||||||
|
return Default;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'NAME',
|
||||||
|
get: function get() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'DATA_KEY',
|
||||||
|
get: function get() {
|
||||||
|
return DATA_KEY;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'Event',
|
||||||
|
get: function get() {
|
||||||
|
return Event;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'EVENT_KEY',
|
||||||
|
get: function get() {
|
||||||
|
return EVENT_KEY;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'DefaultType',
|
||||||
|
get: function get() {
|
||||||
|
return DefaultType;
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return Popover;
|
||||||
|
})(Tooltip);
|
||||||
|
|
||||||
|
$.fn[NAME] = Popover._jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Popover;
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Popover._jQueryInterface;
|
||||||
|
};
|
||||||
|
|
||||||
|
return Popover;
|
||||||
|
})(jQuery);
|
||||||
|
//# sourceMappingURL=popover.js.map
|
|
@ -0,0 +1,320 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): scrollspy.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var ScrollSpy = (function ($) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var NAME = 'scrollspy';
|
||||||
|
var VERSION = '4.0.0-alpha';
|
||||||
|
var DATA_KEY = 'bs.scrollspy';
|
||||||
|
var EVENT_KEY = '.' + DATA_KEY;
|
||||||
|
var DATA_API_KEY = '.data-api';
|
||||||
|
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
|
||||||
|
var Default = {
|
||||||
|
offset: 10,
|
||||||
|
method: 'auto',
|
||||||
|
target: ''
|
||||||
|
};
|
||||||
|
|
||||||
|
var DefaultType = {
|
||||||
|
offset: 'number',
|
||||||
|
method: 'string',
|
||||||
|
target: '(string|element)'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Event = {
|
||||||
|
ACTIVATE: 'activate' + EVENT_KEY,
|
||||||
|
SCROLL: 'scroll' + EVENT_KEY,
|
||||||
|
LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY
|
||||||
|
};
|
||||||
|
|
||||||
|
var ClassName = {
|
||||||
|
DROPDOWN_ITEM: 'dropdown-item',
|
||||||
|
DROPDOWN_MENU: 'dropdown-menu',
|
||||||
|
NAV_LINK: 'nav-link',
|
||||||
|
NAV: 'nav',
|
||||||
|
ACTIVE: 'active'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Selector = {
|
||||||
|
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'
|
||||||
|
};
|
||||||
|
|
||||||
|
var OffsetMethod = {
|
||||||
|
OFFSET: 'offset',
|
||||||
|
POSITION: 'position'
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var ScrollSpy = (function () {
|
||||||
|
function ScrollSpy(element, config) {
|
||||||
|
_classCallCheck(this, ScrollSpy);
|
||||||
|
|
||||||
|
this._element = element;
|
||||||
|
this._scrollElement = element.tagName === 'BODY' ? window : element;
|
||||||
|
this._config = this._getConfig(config);
|
||||||
|
this._selector = this._config.target + ' ' + Selector.NAV_LINKS + ',' + (this._config.target + ' ' + Selector.DROPDOWN_ITEMS);
|
||||||
|
this._offsets = [];
|
||||||
|
this._targets = [];
|
||||||
|
this._activeTarget = null;
|
||||||
|
this._scrollHeight = 0;
|
||||||
|
|
||||||
|
$(this._scrollElement).on(Event.SCROLL, $.proxy(this._process, this));
|
||||||
|
|
||||||
|
this.refresh();
|
||||||
|
this._process();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
_createClass(ScrollSpy, [{
|
||||||
|
key: 'refresh',
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
value: function refresh() {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;
|
||||||
|
|
||||||
|
var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
|
||||||
|
|
||||||
|
var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
|
||||||
|
|
||||||
|
this._offsets = [];
|
||||||
|
this._targets = [];
|
||||||
|
|
||||||
|
this._scrollHeight = this._getScrollHeight();
|
||||||
|
|
||||||
|
var targets = $.makeArray($(this._selector));
|
||||||
|
|
||||||
|
targets.map(function (element) {
|
||||||
|
var target = undefined;
|
||||||
|
var targetSelector = Util.getSelectorFromElement(element);
|
||||||
|
|
||||||
|
if (targetSelector) {
|
||||||
|
target = $(targetSelector)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target && (target.offsetWidth || target.offsetHeight)) {
|
||||||
|
// todo (fat): remove sketch reliance on jQuery position/offset
|
||||||
|
return [$(target)[offsetMethod]().top + offsetBase, targetSelector];
|
||||||
|
}
|
||||||
|
}).filter(function (item) {
|
||||||
|
return item;
|
||||||
|
}).sort(function (a, b) {
|
||||||
|
return a[0] - b[0];
|
||||||
|
}).forEach(function (item) {
|
||||||
|
_this._offsets.push(item[0]);
|
||||||
|
_this._targets.push(item[1]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'dispose',
|
||||||
|
value: function dispose() {
|
||||||
|
$.removeData(this._element, DATA_KEY);
|
||||||
|
$(this._scrollElement).off(EVENT_KEY);
|
||||||
|
|
||||||
|
this._element = null;
|
||||||
|
this._scrollElement = null;
|
||||||
|
this._config = null;
|
||||||
|
this._selector = null;
|
||||||
|
this._offsets = null;
|
||||||
|
this._targets = null;
|
||||||
|
this._activeTarget = null;
|
||||||
|
this._scrollHeight = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
}, {
|
||||||
|
key: '_getConfig',
|
||||||
|
value: function _getConfig(config) {
|
||||||
|
config = $.extend({}, Default, config);
|
||||||
|
|
||||||
|
if (typeof config.target !== 'string') {
|
||||||
|
var id = $(config.target).attr('id');
|
||||||
|
if (!id) {
|
||||||
|
id = Util.getUID(NAME);
|
||||||
|
$(config.target).attr('id', id);
|
||||||
|
}
|
||||||
|
config.target = '#' + id;
|
||||||
|
}
|
||||||
|
|
||||||
|
Util.typeCheckConfig(NAME, config, DefaultType);
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_getScrollTop',
|
||||||
|
value: function _getScrollTop() {
|
||||||
|
return this._scrollElement === window ? this._scrollElement.scrollY : this._scrollElement.scrollTop;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_getScrollHeight',
|
||||||
|
value: function _getScrollHeight() {
|
||||||
|
return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_process',
|
||||||
|
value: function _process() {
|
||||||
|
var scrollTop = this._getScrollTop() + this._config.offset;
|
||||||
|
var scrollHeight = this._getScrollHeight();
|
||||||
|
var maxScroll = this._config.offset + scrollHeight - this._scrollElement.offsetHeight;
|
||||||
|
|
||||||
|
if (this._scrollHeight !== scrollHeight) {
|
||||||
|
this.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scrollTop >= maxScroll) {
|
||||||
|
var target = this._targets[this._targets.length - 1];
|
||||||
|
|
||||||
|
if (this._activeTarget !== target) {
|
||||||
|
this._activate(target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._activeTarget && scrollTop < this._offsets[0]) {
|
||||||
|
this._activeTarget = null;
|
||||||
|
this._clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = this._offsets.length; i--;) {
|
||||||
|
var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (this._offsets[i + 1] === undefined || scrollTop < this._offsets[i + 1]);
|
||||||
|
|
||||||
|
if (isActiveTarget) {
|
||||||
|
this._activate(this._targets[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_activate',
|
||||||
|
value: function _activate(target) {
|
||||||
|
this._activeTarget = target;
|
||||||
|
|
||||||
|
this._clear();
|
||||||
|
|
||||||
|
var queries = this._selector.split(',');
|
||||||
|
queries = queries.map(function (selector) {
|
||||||
|
return selector + '[data-target="' + target + '"],' + (selector + '[href="' + target + '"]');
|
||||||
|
});
|
||||||
|
|
||||||
|
var $link = $(queries.join(','));
|
||||||
|
|
||||||
|
if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
|
||||||
|
$link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
|
||||||
|
$link.addClass(ClassName.ACTIVE);
|
||||||
|
} 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._scrollElement).trigger(Event.ACTIVATE, {
|
||||||
|
relatedTarget: target
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_clear',
|
||||||
|
value: function _clear() {
|
||||||
|
$(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
}], [{
|
||||||
|
key: '_jQueryInterface',
|
||||||
|
value: function _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
var data = $(this).data(DATA_KEY);
|
||||||
|
var _config = typeof config === 'object' && config || null;
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new ScrollSpy(this, _config);
|
||||||
|
$(this).data(DATA_KEY, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error('No method named "' + config + '"');
|
||||||
|
}
|
||||||
|
data[config]();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'VERSION',
|
||||||
|
get: function get() {
|
||||||
|
return VERSION;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'Default',
|
||||||
|
get: function get() {
|
||||||
|
return Default;
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return ScrollSpy;
|
||||||
|
})();
|
||||||
|
|
||||||
|
$(window).on(Event.LOAD_DATA_API, function () {
|
||||||
|
var scrollSpys = $.makeArray($(Selector.DATA_SPY));
|
||||||
|
|
||||||
|
for (var i = scrollSpys.length; i--;) {
|
||||||
|
var $spy = $(scrollSpys[i]);
|
||||||
|
ScrollSpy._jQueryInterface.call($spy, $spy.data());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = ScrollSpy._jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = ScrollSpy;
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return ScrollSpy._jQueryInterface;
|
||||||
|
};
|
||||||
|
|
||||||
|
return ScrollSpy;
|
||||||
|
})(jQuery);
|
||||||
|
//# sourceMappingURL=scrollspy.js.map
|
|
@ -0,0 +1,263 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): tab.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Tab = (function ($) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var NAME = 'tab';
|
||||||
|
var VERSION = '4.0.0-alpha';
|
||||||
|
var DATA_KEY = 'bs.tab';
|
||||||
|
var EVENT_KEY = '.' + DATA_KEY;
|
||||||
|
var DATA_API_KEY = '.data-api';
|
||||||
|
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
var TRANSITION_DURATION = 150;
|
||||||
|
|
||||||
|
var Event = {
|
||||||
|
HIDE: 'hide' + EVENT_KEY,
|
||||||
|
HIDDEN: 'hidden' + EVENT_KEY,
|
||||||
|
SHOW: 'show' + EVENT_KEY,
|
||||||
|
SHOWN: 'shown' + EVENT_KEY,
|
||||||
|
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
|
||||||
|
};
|
||||||
|
|
||||||
|
var ClassName = {
|
||||||
|
DROPDOWN_MENU: 'dropdown-menu',
|
||||||
|
ACTIVE: 'active',
|
||||||
|
FADE: 'fade',
|
||||||
|
IN: 'in'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Selector = {
|
||||||
|
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'
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Tab = (function () {
|
||||||
|
function Tab(element) {
|
||||||
|
_classCallCheck(this, Tab);
|
||||||
|
|
||||||
|
this._element = element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
_createClass(Tab, [{
|
||||||
|
key: 'show',
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
value: function show() {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var target = undefined;
|
||||||
|
var previous = undefined;
|
||||||
|
var ulElement = $(this._element).closest(Selector.UL)[0];
|
||||||
|
var selector = Util.getSelectorFromElement(this._element);
|
||||||
|
|
||||||
|
if (ulElement) {
|
||||||
|
previous = $.makeArray($(ulElement).find(Selector.ACTIVE));
|
||||||
|
previous = previous[previous.length - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
var hideEvent = $.Event(Event.HIDE, {
|
||||||
|
relatedTarget: this._element
|
||||||
|
});
|
||||||
|
|
||||||
|
var showEvent = $.Event(Event.SHOW, {
|
||||||
|
relatedTarget: previous
|
||||||
|
});
|
||||||
|
|
||||||
|
if (previous) {
|
||||||
|
$(previous).trigger(hideEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._element).trigger(showEvent);
|
||||||
|
|
||||||
|
if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selector) {
|
||||||
|
target = $(selector)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
this._activate(this._element, ulElement);
|
||||||
|
|
||||||
|
var complete = function complete() {
|
||||||
|
var hiddenEvent = $.Event(Event.HIDDEN, {
|
||||||
|
relatedTarget: _this._element
|
||||||
|
});
|
||||||
|
|
||||||
|
var shownEvent = $.Event(Event.SHOWN, {
|
||||||
|
relatedTarget: previous
|
||||||
|
});
|
||||||
|
|
||||||
|
$(previous).trigger(hiddenEvent);
|
||||||
|
$(_this._element).trigger(shownEvent);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (target) {
|
||||||
|
this._activate(target, target.parentNode, complete);
|
||||||
|
} else {
|
||||||
|
complete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'dispose',
|
||||||
|
value: function dispose() {
|
||||||
|
$.removeClass(this._element, DATA_KEY);
|
||||||
|
this._element = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
}, {
|
||||||
|
key: '_activate',
|
||||||
|
value: function _activate(element, container, callback) {
|
||||||
|
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);
|
||||||
|
|
||||||
|
if (active && isTransitioning) {
|
||||||
|
$(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
|
||||||
|
} else {
|
||||||
|
complete();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (active) {
|
||||||
|
$(active).removeClass(ClassName.IN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_transitionComplete',
|
||||||
|
value: function _transitionComplete(element, active, isTransitioning, callback) {
|
||||||
|
if (active) {
|
||||||
|
$(active).removeClass(ClassName.ACTIVE);
|
||||||
|
|
||||||
|
var dropdownChild = $(active).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
|
||||||
|
|
||||||
|
if (dropdownChild) {
|
||||||
|
$(dropdownChild).removeClass(ClassName.ACTIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
active.setAttribute('aria-expanded', false);
|
||||||
|
}
|
||||||
|
|
||||||
|
$(element).addClass(ClassName.ACTIVE);
|
||||||
|
element.setAttribute('aria-expanded', true);
|
||||||
|
|
||||||
|
if (isTransitioning) {
|
||||||
|
Util.reflow(element);
|
||||||
|
$(element).addClass(ClassName.IN);
|
||||||
|
} else {
|
||||||
|
$(element).removeClass(ClassName.FADE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
|
||||||
|
|
||||||
|
var dropdownElement = $(element).closest(Selector.DROPDOWN)[0];
|
||||||
|
if (dropdownElement) {
|
||||||
|
$(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
element.setAttribute('aria-expanded', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (callback) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
}], [{
|
||||||
|
key: '_jQueryInterface',
|
||||||
|
value: function _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this);
|
||||||
|
var data = $this.data(DATA_KEY);
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = data = new Tab(this);
|
||||||
|
$this.data(DATA_KEY, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error('No method named "' + config + '"');
|
||||||
|
}
|
||||||
|
data[config]();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'VERSION',
|
||||||
|
get: function get() {
|
||||||
|
return VERSION;
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return Tab;
|
||||||
|
})();
|
||||||
|
|
||||||
|
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
Tab._jQueryInterface.call($(this), 'show');
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Tab._jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Tab;
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Tab._jQueryInterface;
|
||||||
|
};
|
||||||
|
|
||||||
|
return Tab;
|
||||||
|
})(jQuery);
|
||||||
|
//# sourceMappingURL=tab.js.map
|
|
@ -0,0 +1,619 @@
|
||||||
|
/* global Tether */
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): tooltip.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Tooltip = (function ($) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check for Tether dependency
|
||||||
|
* Tether - http://github.hubspot.com/tether/
|
||||||
|
*/
|
||||||
|
if (window.Tether === undefined) {
|
||||||
|
throw new Error('Bootstrap tooltips require Tether (http://github.hubspot.com/tether/)');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var NAME = 'tooltip';
|
||||||
|
var VERSION = '4.0.0-alpha';
|
||||||
|
var DATA_KEY = 'bs.tooltip';
|
||||||
|
var EVENT_KEY = '.' + DATA_KEY;
|
||||||
|
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
var TRANSITION_DURATION = 150;
|
||||||
|
var CLASS_PREFIX = 'bs-tether';
|
||||||
|
|
||||||
|
var Default = {
|
||||||
|
animation: true,
|
||||||
|
template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div></div>',
|
||||||
|
trigger: 'hover focus',
|
||||||
|
title: '',
|
||||||
|
delay: 0,
|
||||||
|
html: false,
|
||||||
|
selector: false,
|
||||||
|
placement: 'top',
|
||||||
|
offset: '0 0',
|
||||||
|
constraints: []
|
||||||
|
};
|
||||||
|
|
||||||
|
var DefaultType = {
|
||||||
|
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'
|
||||||
|
};
|
||||||
|
|
||||||
|
var AttachmentMap = {
|
||||||
|
TOP: 'bottom center',
|
||||||
|
RIGHT: 'middle left',
|
||||||
|
BOTTOM: 'top center',
|
||||||
|
LEFT: 'middle right'
|
||||||
|
};
|
||||||
|
|
||||||
|
var HoverState = {
|
||||||
|
IN: 'in',
|
||||||
|
OUT: 'out'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Event = {
|
||||||
|
HIDE: 'hide' + EVENT_KEY,
|
||||||
|
HIDDEN: 'hidden' + EVENT_KEY,
|
||||||
|
SHOW: 'show' + EVENT_KEY,
|
||||||
|
SHOWN: 'shown' + EVENT_KEY,
|
||||||
|
INSERTED: 'inserted' + EVENT_KEY,
|
||||||
|
CLICK: 'click' + EVENT_KEY,
|
||||||
|
FOCUSIN: 'focusin' + EVENT_KEY,
|
||||||
|
FOCUSOUT: 'focusout' + EVENT_KEY,
|
||||||
|
MOUSEENTER: 'mouseenter' + EVENT_KEY,
|
||||||
|
MOUSELEAVE: 'mouseleave' + EVENT_KEY
|
||||||
|
};
|
||||||
|
|
||||||
|
var ClassName = {
|
||||||
|
FADE: 'fade',
|
||||||
|
IN: 'in'
|
||||||
|
};
|
||||||
|
|
||||||
|
var Selector = {
|
||||||
|
TOOLTIP: '.tooltip',
|
||||||
|
TOOLTIP_INNER: '.tooltip-inner'
|
||||||
|
};
|
||||||
|
|
||||||
|
var TetherClass = {
|
||||||
|
element: false,
|
||||||
|
enabled: false
|
||||||
|
};
|
||||||
|
|
||||||
|
var Trigger = {
|
||||||
|
HOVER: 'hover',
|
||||||
|
FOCUS: 'focus',
|
||||||
|
CLICK: 'click',
|
||||||
|
MANUAL: 'manual'
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Tooltip = (function () {
|
||||||
|
function Tooltip(element, config) {
|
||||||
|
_classCallCheck(this, Tooltip);
|
||||||
|
|
||||||
|
// private
|
||||||
|
this._isEnabled = true;
|
||||||
|
this._timeout = 0;
|
||||||
|
this._hoverState = '';
|
||||||
|
this._activeTrigger = {};
|
||||||
|
this._tether = null;
|
||||||
|
|
||||||
|
// protected
|
||||||
|
this.element = element;
|
||||||
|
this.config = this._getConfig(config);
|
||||||
|
this.tip = null;
|
||||||
|
|
||||||
|
this._setListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
_createClass(Tooltip, [{
|
||||||
|
key: 'enable',
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
value: function enable() {
|
||||||
|
this._isEnabled = true;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'disable',
|
||||||
|
value: function disable() {
|
||||||
|
this._isEnabled = false;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'toggleEnabled',
|
||||||
|
value: function toggleEnabled() {
|
||||||
|
this._isEnabled = !this._isEnabled;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'toggle',
|
||||||
|
value: function toggle(event) {
|
||||||
|
if (event) {
|
||||||
|
var dataKey = this.constructor.DATA_KEY;
|
||||||
|
var context = $(event.currentTarget).data(dataKey);
|
||||||
|
|
||||||
|
if (!context) {
|
||||||
|
context = new this.constructor(event.currentTarget, this._getDelegateConfig());
|
||||||
|
$(event.currentTarget).data(dataKey, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
context._activeTrigger.click = !context._activeTrigger.click;
|
||||||
|
|
||||||
|
if (context._isWithActiveTrigger()) {
|
||||||
|
context._enter(null, context);
|
||||||
|
} else {
|
||||||
|
context._leave(null, context);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if ($(this.getTipElement()).hasClass(ClassName.IN)) {
|
||||||
|
this._leave(null, this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._enter(null, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'dispose',
|
||||||
|
value: function dispose() {
|
||||||
|
clearTimeout(this._timeout);
|
||||||
|
|
||||||
|
this.cleanupTether();
|
||||||
|
|
||||||
|
$.removeData(this.element, this.constructor.DATA_KEY);
|
||||||
|
|
||||||
|
$(this.element).off(this.constructor.EVENT_KEY);
|
||||||
|
|
||||||
|
if (this.tip) {
|
||||||
|
$(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;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'show',
|
||||||
|
value: function show() {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
var showEvent = $.Event(this.constructor.Event.SHOW);
|
||||||
|
|
||||||
|
if (this.isWithContent() && this._isEnabled) {
|
||||||
|
$(this.element).trigger(showEvent);
|
||||||
|
|
||||||
|
var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element);
|
||||||
|
|
||||||
|
if (showEvent.isDefaultPrevented() || !isInTheDom) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var tip = this.getTipElement();
|
||||||
|
var tipId = Util.getUID(this.constructor.NAME);
|
||||||
|
|
||||||
|
tip.setAttribute('id', tipId);
|
||||||
|
this.element.setAttribute('aria-describedby', tipId);
|
||||||
|
|
||||||
|
this.setContent();
|
||||||
|
|
||||||
|
if (this.config.animation) {
|
||||||
|
$(tip).addClass(ClassName.FADE);
|
||||||
|
}
|
||||||
|
|
||||||
|
var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
|
||||||
|
|
||||||
|
var attachment = this._getAttachment(placement);
|
||||||
|
|
||||||
|
$(tip).data(this.constructor.DATA_KEY, this).appendTo(document.body);
|
||||||
|
|
||||||
|
$(this.element).trigger(this.constructor.Event.INSERTED);
|
||||||
|
|
||||||
|
this._tether = new Tether({
|
||||||
|
attachment: attachment,
|
||||||
|
element: tip,
|
||||||
|
target: this.element,
|
||||||
|
classes: TetherClass,
|
||||||
|
classPrefix: CLASS_PREFIX,
|
||||||
|
offset: this.config.offset,
|
||||||
|
constraints: this.config.constraints,
|
||||||
|
addTargetClasses: false
|
||||||
|
});
|
||||||
|
|
||||||
|
Util.reflow(tip);
|
||||||
|
this._tether.position();
|
||||||
|
|
||||||
|
$(tip).addClass(ClassName.IN);
|
||||||
|
|
||||||
|
var complete = function complete() {
|
||||||
|
var prevHoverState = _this._hoverState;
|
||||||
|
_this._hoverState = null;
|
||||||
|
|
||||||
|
$(_this.element).trigger(_this.constructor.Event.SHOWN);
|
||||||
|
|
||||||
|
if (prevHoverState === HoverState.OUT) {
|
||||||
|
_this._leave(null, _this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
|
||||||
|
$(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
complete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'hide',
|
||||||
|
value: function hide(callback) {
|
||||||
|
var _this2 = this;
|
||||||
|
|
||||||
|
var tip = this.getTipElement();
|
||||||
|
var hideEvent = $.Event(this.constructor.Event.HIDE);
|
||||||
|
var complete = function complete() {
|
||||||
|
if (_this2._hoverState !== HoverState.IN && tip.parentNode) {
|
||||||
|
tip.parentNode.removeChild(tip);
|
||||||
|
}
|
||||||
|
|
||||||
|
_this2.element.removeAttribute('aria-describedby');
|
||||||
|
$(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
|
||||||
|
_this2.cleanupTether();
|
||||||
|
|
||||||
|
if (callback) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$(this.element).trigger(hideEvent);
|
||||||
|
|
||||||
|
if (hideEvent.isDefaultPrevented()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$(tip).removeClass(ClassName.IN);
|
||||||
|
|
||||||
|
if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
|
||||||
|
|
||||||
|
$(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
|
||||||
|
} else {
|
||||||
|
complete();
|
||||||
|
}
|
||||||
|
|
||||||
|
this._hoverState = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// protected
|
||||||
|
|
||||||
|
}, {
|
||||||
|
key: 'isWithContent',
|
||||||
|
value: function isWithContent() {
|
||||||
|
return Boolean(this.getTitle());
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'getTipElement',
|
||||||
|
value: function getTipElement() {
|
||||||
|
return this.tip = this.tip || $(this.config.template)[0];
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'setContent',
|
||||||
|
value: function setContent() {
|
||||||
|
var $tip = $(this.getTipElement());
|
||||||
|
|
||||||
|
this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());
|
||||||
|
|
||||||
|
$tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);
|
||||||
|
|
||||||
|
this.cleanupTether();
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'setElementContent',
|
||||||
|
value: function setElementContent($element, content) {
|
||||||
|
var html = this.config.html;
|
||||||
|
if (typeof content === 'object' && (content.nodeType || content.jquery)) {
|
||||||
|
// content is a DOM node or a jQuery
|
||||||
|
if (html) {
|
||||||
|
if (!$(content).parent().is($element)) {
|
||||||
|
$element.empty().append(content);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$element.text($(content).text());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$element[html ? 'html' : 'text'](content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'getTitle',
|
||||||
|
value: function getTitle() {
|
||||||
|
var title = this.element.getAttribute('data-original-title');
|
||||||
|
|
||||||
|
if (!title) {
|
||||||
|
title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
|
||||||
|
}
|
||||||
|
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'cleanupTether',
|
||||||
|
value: function cleanupTether() {
|
||||||
|
if (this._tether) {
|
||||||
|
this._tether.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
}, {
|
||||||
|
key: '_getAttachment',
|
||||||
|
value: function _getAttachment(placement) {
|
||||||
|
return AttachmentMap[placement.toUpperCase()];
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_setListeners',
|
||||||
|
value: function _setListeners() {
|
||||||
|
var _this3 = this;
|
||||||
|
|
||||||
|
var triggers = this.config.trigger.split(' ');
|
||||||
|
|
||||||
|
triggers.forEach(function (trigger) {
|
||||||
|
if (trigger === 'click') {
|
||||||
|
$(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, $.proxy(_this3.toggle, _this3));
|
||||||
|
} 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));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (this.config.selector) {
|
||||||
|
this.config = $.extend({}, this.config, {
|
||||||
|
trigger: 'manual',
|
||||||
|
selector: ''
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this._fixTitle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_fixTitle',
|
||||||
|
value: function _fixTitle() {
|
||||||
|
var titleType = typeof this.element.getAttribute('data-original-title');
|
||||||
|
if (this.element.getAttribute('title') || titleType !== 'string') {
|
||||||
|
this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
|
||||||
|
this.element.setAttribute('title', '');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_enter',
|
||||||
|
value: function _enter(event, context) {
|
||||||
|
var dataKey = this.constructor.DATA_KEY;
|
||||||
|
|
||||||
|
context = context || $(event.currentTarget).data(dataKey);
|
||||||
|
|
||||||
|
if (!context) {
|
||||||
|
context = new this.constructor(event.currentTarget, this._getDelegateConfig());
|
||||||
|
$(event.currentTarget).data(dataKey, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event) {
|
||||||
|
context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($(context.getTipElement()).hasClass(ClassName.IN) || context._hoverState === HoverState.IN) {
|
||||||
|
context._hoverState = HoverState.IN;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clearTimeout(context._timeout);
|
||||||
|
|
||||||
|
context._hoverState = HoverState.IN;
|
||||||
|
|
||||||
|
if (!context.config.delay || !context.config.delay.show) {
|
||||||
|
context.show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
context._timeout = setTimeout(function () {
|
||||||
|
if (context._hoverState === HoverState.IN) {
|
||||||
|
context.show();
|
||||||
|
}
|
||||||
|
}, context.config.delay.show);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_leave',
|
||||||
|
value: function _leave(event, context) {
|
||||||
|
var dataKey = this.constructor.DATA_KEY;
|
||||||
|
|
||||||
|
context = context || $(event.currentTarget).data(dataKey);
|
||||||
|
|
||||||
|
if (!context) {
|
||||||
|
context = new this.constructor(event.currentTarget, this._getDelegateConfig());
|
||||||
|
$(event.currentTarget).data(dataKey, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event) {
|
||||||
|
context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (context._isWithActiveTrigger()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clearTimeout(context._timeout);
|
||||||
|
|
||||||
|
context._hoverState = HoverState.OUT;
|
||||||
|
|
||||||
|
if (!context.config.delay || !context.config.delay.hide) {
|
||||||
|
context.hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
context._timeout = setTimeout(function () {
|
||||||
|
if (context._hoverState === HoverState.OUT) {
|
||||||
|
context.hide();
|
||||||
|
}
|
||||||
|
}, context.config.delay.hide);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_isWithActiveTrigger',
|
||||||
|
value: function _isWithActiveTrigger() {
|
||||||
|
for (var trigger in this._activeTrigger) {
|
||||||
|
if (this._activeTrigger[trigger]) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_getConfig',
|
||||||
|
value: function _getConfig(config) {
|
||||||
|
config = $.extend({}, this.constructor.Default, $(this.element).data(), config);
|
||||||
|
|
||||||
|
if (config.delay && typeof config.delay === 'number') {
|
||||||
|
config.delay = {
|
||||||
|
show: config.delay,
|
||||||
|
hide: config.delay
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: '_getDelegateConfig',
|
||||||
|
value: function _getDelegateConfig() {
|
||||||
|
var config = {};
|
||||||
|
|
||||||
|
if (this.config) {
|
||||||
|
for (var key in this.config) {
|
||||||
|
if (this.constructor.Default[key] !== this.config[key]) {
|
||||||
|
config[key] = this.config[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
}], [{
|
||||||
|
key: '_jQueryInterface',
|
||||||
|
value: function _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
var data = $(this).data(DATA_KEY);
|
||||||
|
var _config = typeof config === 'object' ? config : null;
|
||||||
|
|
||||||
|
if (!data && /destroy|hide/.test(config)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Tooltip(this, _config);
|
||||||
|
$(this).data(DATA_KEY, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error('No method named "' + config + '"');
|
||||||
|
}
|
||||||
|
data[config]();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'VERSION',
|
||||||
|
get: function get() {
|
||||||
|
return VERSION;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'Default',
|
||||||
|
get: function get() {
|
||||||
|
return Default;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'NAME',
|
||||||
|
get: function get() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'DATA_KEY',
|
||||||
|
get: function get() {
|
||||||
|
return DATA_KEY;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'Event',
|
||||||
|
get: function get() {
|
||||||
|
return Event;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'EVENT_KEY',
|
||||||
|
get: function get() {
|
||||||
|
return EVENT_KEY;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'DefaultType',
|
||||||
|
get: function get() {
|
||||||
|
return DefaultType;
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return Tooltip;
|
||||||
|
})();
|
||||||
|
|
||||||
|
$.fn[NAME] = Tooltip._jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Tooltip;
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Tooltip._jQueryInterface;
|
||||||
|
};
|
||||||
|
|
||||||
|
return Tooltip;
|
||||||
|
})(jQuery);
|
||||||
|
//# sourceMappingURL=tooltip.js.map
|
|
@ -0,0 +1,157 @@
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): util.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var Util = (function ($) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Private TransitionEnd Helpers
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var transition = false;
|
||||||
|
|
||||||
|
var TransitionEndEvent = {
|
||||||
|
WebkitTransition: 'webkitTransitionEnd',
|
||||||
|
MozTransition: 'transitionend',
|
||||||
|
OTransition: 'oTransitionEnd otransitionend',
|
||||||
|
transition: 'transitionend'
|
||||||
|
};
|
||||||
|
|
||||||
|
// shoutout AngusCroll (https://goo.gl/pxwQGp)
|
||||||
|
function toType(obj) {
|
||||||
|
return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function isElement(obj) {
|
||||||
|
return (obj[0] || obj).nodeType;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSpecialTransitionEndEvent() {
|
||||||
|
return {
|
||||||
|
bindType: transition.end,
|
||||||
|
delegateType: transition.end,
|
||||||
|
handle: function handle(event) {
|
||||||
|
if ($(event.target).is(this)) {
|
||||||
|
return event.handleObj.handler.apply(this, arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function transitionEndTest() {
|
||||||
|
if (window.QUnit) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var el = document.createElement('bootstrap');
|
||||||
|
|
||||||
|
for (var _name in TransitionEndEvent) {
|
||||||
|
if (el.style[_name] !== undefined) {
|
||||||
|
return { end: TransitionEndEvent[_name] };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function transitionEndEmulator(duration) {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
var called = false;
|
||||||
|
|
||||||
|
$(this).one(Util.TRANSITION_END, function () {
|
||||||
|
called = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
setTimeout(function () {
|
||||||
|
if (!called) {
|
||||||
|
Util.triggerTransitionEnd(_this);
|
||||||
|
}
|
||||||
|
}, duration);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setTransitionEndSupport() {
|
||||||
|
transition = transitionEndTest();
|
||||||
|
|
||||||
|
$.fn.emulateTransitionEnd = transitionEndEmulator;
|
||||||
|
|
||||||
|
if (Util.supportsTransitionEnd()) {
|
||||||
|
$.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Public Util Api
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Util = {
|
||||||
|
|
||||||
|
TRANSITION_END: 'bsTransitionEnd',
|
||||||
|
|
||||||
|
getUID: function getUID(prefix) {
|
||||||
|
do {
|
||||||
|
prefix += ~ ~(Math.random() * 1000000); // "~~" acts like a faster Math.floor() here
|
||||||
|
} while (document.getElementById(prefix));
|
||||||
|
return prefix;
|
||||||
|
},
|
||||||
|
|
||||||
|
getSelectorFromElement: function getSelectorFromElement(element) {
|
||||||
|
var selector = element.getAttribute('data-target');
|
||||||
|
|
||||||
|
if (!selector) {
|
||||||
|
selector = element.getAttribute('href') || '';
|
||||||
|
selector = /^#[a-z]/i.test(selector) ? selector : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return selector;
|
||||||
|
},
|
||||||
|
|
||||||
|
reflow: function reflow(element) {
|
||||||
|
new Function('bs', 'return bs')(element.offsetHeight);
|
||||||
|
},
|
||||||
|
|
||||||
|
triggerTransitionEnd: function triggerTransitionEnd(element) {
|
||||||
|
$(element).trigger(transition.end);
|
||||||
|
},
|
||||||
|
|
||||||
|
supportsTransitionEnd: function supportsTransitionEnd() {
|
||||||
|
return Boolean(transition);
|
||||||
|
},
|
||||||
|
|
||||||
|
typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
|
||||||
|
for (var property in configTypes) {
|
||||||
|
if (configTypes.hasOwnProperty(property)) {
|
||||||
|
var expectedTypes = configTypes[property];
|
||||||
|
var value = config[property];
|
||||||
|
var valueType = undefined;
|
||||||
|
|
||||||
|
if (value && isElement(value)) {
|
||||||
|
valueType = 'element';
|
||||||
|
} else {
|
||||||
|
valueType = toType(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!new RegExp(expectedTypes).test(valueType)) {
|
||||||
|
throw new Error(componentName.toUpperCase() + ': ' + ('Option "' + property + '" provided type "' + valueType + '" ') + ('but expected type "' + expectedTypes + '".'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
setTransitionEndSupport();
|
||||||
|
|
||||||
|
return Util;
|
||||||
|
})(jQuery);
|
||||||
|
//# sourceMappingURL=util.js.map
|
|
@ -0,0 +1,193 @@
|
||||||
|
import Util from './util'
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): alert.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Alert = (($) => {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'alert'
|
||||||
|
const VERSION = '4.0.0-alpha'
|
||||||
|
const DATA_KEY = 'bs.alert'
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`
|
||||||
|
const DATA_API_KEY = '.data-api'
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
||||||
|
const TRANSITION_DURATION = 150
|
||||||
|
|
||||||
|
const Selector = {
|
||||||
|
DISMISS : '[data-dismiss="alert"]'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Event = {
|
||||||
|
CLOSE : `close${EVENT_KEY}`,
|
||||||
|
CLOSED : `closed${EVENT_KEY}`,
|
||||||
|
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const ClassName = {
|
||||||
|
ALERT : 'alert',
|
||||||
|
FADE : 'fade',
|
||||||
|
IN : 'in'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Alert {
|
||||||
|
|
||||||
|
constructor(element) {
|
||||||
|
this._element = element
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
static get VERSION() {
|
||||||
|
return VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
close(element) {
|
||||||
|
element = element || this._element
|
||||||
|
|
||||||
|
let rootElement = this._getRootElement(element)
|
||||||
|
let customEvent = this._triggerCloseEvent(rootElement)
|
||||||
|
|
||||||
|
if (customEvent.isDefaultPrevented()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this._removeElement(rootElement)
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
$.removeData(this._element, DATA_KEY)
|
||||||
|
this._element = null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
_getRootElement(element) {
|
||||||
|
let selector = Util.getSelectorFromElement(element)
|
||||||
|
let parent = false
|
||||||
|
|
||||||
|
if (selector) {
|
||||||
|
parent = $(selector)[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!parent) {
|
||||||
|
parent = $(element).closest(`.${ClassName.ALERT}`)[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent
|
||||||
|
}
|
||||||
|
|
||||||
|
_triggerCloseEvent(element) {
|
||||||
|
let closeEvent = $.Event(Event.CLOSE)
|
||||||
|
|
||||||
|
$(element).trigger(closeEvent)
|
||||||
|
return closeEvent
|
||||||
|
}
|
||||||
|
|
||||||
|
_removeElement(element) {
|
||||||
|
$(element).removeClass(ClassName.IN)
|
||||||
|
|
||||||
|
if (!Util.supportsTransitionEnd() ||
|
||||||
|
!$(element).hasClass(ClassName.FADE)) {
|
||||||
|
this._destroyElement(element)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
$(element)
|
||||||
|
.one(Util.TRANSITION_END, $.proxy(this._destroyElement, this, element))
|
||||||
|
.emulateTransitionEnd(TRANSITION_DURATION)
|
||||||
|
}
|
||||||
|
|
||||||
|
_destroyElement(element) {
|
||||||
|
$(element)
|
||||||
|
.detach()
|
||||||
|
.trigger(Event.CLOSED)
|
||||||
|
.remove()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
static _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
let $element = $(this)
|
||||||
|
let data = $element.data(DATA_KEY)
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Alert(this)
|
||||||
|
$element.data(DATA_KEY, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config === 'close') {
|
||||||
|
data[config](this)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
static _handleDismiss(alertInstance) {
|
||||||
|
return function (event) {
|
||||||
|
if (event) {
|
||||||
|
event.preventDefault()
|
||||||
|
}
|
||||||
|
|
||||||
|
alertInstance.close(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$(document).on(
|
||||||
|
Event.CLICK_DATA_API,
|
||||||
|
Selector.DISMISS,
|
||||||
|
Alert._handleDismiss(new Alert())
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Alert._jQueryInterface
|
||||||
|
$.fn[NAME].Constructor = Alert
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT
|
||||||
|
return Alert._jQueryInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
return Alert
|
||||||
|
|
||||||
|
})(jQuery)
|
||||||
|
|
||||||
|
export default Alert
|
|
@ -0,0 +1,173 @@
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): button.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Button = (($) => {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'button'
|
||||||
|
const VERSION = '4.0.0-alpha'
|
||||||
|
const DATA_KEY = 'bs.button'
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`
|
||||||
|
const DATA_API_KEY = '.data-api'
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
||||||
|
|
||||||
|
const ClassName = {
|
||||||
|
ACTIVE : 'active',
|
||||||
|
BUTTON : 'btn',
|
||||||
|
FOCUS : 'focus'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Selector = {
|
||||||
|
DATA_TOGGLE_CARROT : '[data-toggle^="button"]',
|
||||||
|
DATA_TOGGLE : '[data-toggle="buttons"]',
|
||||||
|
INPUT : 'input',
|
||||||
|
ACTIVE : '.active',
|
||||||
|
BUTTON : '.btn'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Event = {
|
||||||
|
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
|
||||||
|
FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} `
|
||||||
|
+ `blur${EVENT_KEY}${DATA_API_KEY}`
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Button {
|
||||||
|
|
||||||
|
constructor(element) {
|
||||||
|
this._element = element
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
static get VERSION() {
|
||||||
|
return VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
toggle() {
|
||||||
|
let triggerChangeEvent = true
|
||||||
|
let rootElement = $(this._element).closest(
|
||||||
|
Selector.DATA_TOGGLE
|
||||||
|
)[0]
|
||||||
|
|
||||||
|
if (rootElement) {
|
||||||
|
let input = $(this._element).find(Selector.INPUT)[0]
|
||||||
|
|
||||||
|
if (input) {
|
||||||
|
if (input.type === 'radio') {
|
||||||
|
if (input.checked &&
|
||||||
|
$(this._element).hasClass(ClassName.ACTIVE)) {
|
||||||
|
triggerChangeEvent = false
|
||||||
|
|
||||||
|
} else {
|
||||||
|
let activeElement = $(rootElement).find(Selector.ACTIVE)[0]
|
||||||
|
|
||||||
|
if (activeElement) {
|
||||||
|
$(activeElement).removeClass(ClassName.ACTIVE)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (triggerChangeEvent) {
|
||||||
|
input.checked = !$(this._element).hasClass(ClassName.ACTIVE)
|
||||||
|
$(this._element).trigger('change')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this._element.setAttribute('aria-pressed',
|
||||||
|
!$(this._element).hasClass(ClassName.ACTIVE))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (triggerChangeEvent) {
|
||||||
|
$(this._element).toggleClass(ClassName.ACTIVE)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
$.removeData(this._element, DATA_KEY)
|
||||||
|
this._element = null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
static _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
let data = $(this).data(DATA_KEY)
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Button(this)
|
||||||
|
$(this).data(DATA_KEY, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config === 'toggle') {
|
||||||
|
data[config]()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$(document)
|
||||||
|
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
|
||||||
|
event.preventDefault()
|
||||||
|
|
||||||
|
let button = event.target
|
||||||
|
|
||||||
|
if (!$(button).hasClass(ClassName.BUTTON)) {
|
||||||
|
button = $(button).closest(Selector.BUTTON)
|
||||||
|
}
|
||||||
|
|
||||||
|
Button._jQueryInterface.call($(button), 'toggle')
|
||||||
|
})
|
||||||
|
.on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
|
||||||
|
let button = $(event.target).closest(Selector.BUTTON)[0]
|
||||||
|
$(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Button._jQueryInterface
|
||||||
|
$.fn[NAME].Constructor = Button
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT
|
||||||
|
return Button._jQueryInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
return Button
|
||||||
|
|
||||||
|
})(jQuery)
|
||||||
|
|
||||||
|
export default Button
|
|
@ -0,0 +1,478 @@
|
||||||
|
import Util from './util'
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): carousel.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Carousel = (($) => {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'carousel'
|
||||||
|
const VERSION = '4.0.0-alpha'
|
||||||
|
const DATA_KEY = 'bs.carousel'
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`
|
||||||
|
const DATA_API_KEY = '.data-api'
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
||||||
|
const TRANSITION_DURATION = 600
|
||||||
|
|
||||||
|
const Default = {
|
||||||
|
interval : 5000,
|
||||||
|
keyboard : true,
|
||||||
|
slide : false,
|
||||||
|
pause : 'hover',
|
||||||
|
wrap : true
|
||||||
|
}
|
||||||
|
|
||||||
|
const DefaultType = {
|
||||||
|
interval : '(number|boolean)',
|
||||||
|
keyboard : 'boolean',
|
||||||
|
slide : '(boolean|string)',
|
||||||
|
pause : '(string|boolean)',
|
||||||
|
wrap : 'boolean'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Direction = {
|
||||||
|
NEXT : 'next',
|
||||||
|
PREVIOUS : 'prev'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Event = {
|
||||||
|
SLIDE : `slide${EVENT_KEY}`,
|
||||||
|
SLID : `slid${EVENT_KEY}`,
|
||||||
|
KEYDOWN : `keydown${EVENT_KEY}`,
|
||||||
|
MOUSEENTER : `mouseenter${EVENT_KEY}`,
|
||||||
|
MOUSELEAVE : `mouseleave${EVENT_KEY}`,
|
||||||
|
LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,
|
||||||
|
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const ClassName = {
|
||||||
|
CAROUSEL : 'carousel',
|
||||||
|
ACTIVE : 'active',
|
||||||
|
SLIDE : 'slide',
|
||||||
|
RIGHT : 'right',
|
||||||
|
LEFT : 'left',
|
||||||
|
ITEM : 'carousel-item'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Selector = {
|
||||||
|
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"]'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Carousel {
|
||||||
|
|
||||||
|
constructor(element, config) {
|
||||||
|
this._items = null
|
||||||
|
this._interval = null
|
||||||
|
this._activeElement = null
|
||||||
|
|
||||||
|
this._isPaused = false
|
||||||
|
this._isSliding = false
|
||||||
|
|
||||||
|
this._config = this._getConfig(config)
|
||||||
|
this._element = $(element)[0]
|
||||||
|
this._indicatorsElement = $(this._element).find(Selector.INDICATORS)[0]
|
||||||
|
|
||||||
|
this._addEventListeners()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
static get VERSION() {
|
||||||
|
return VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
static get Default() {
|
||||||
|
return Default
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
next() {
|
||||||
|
if (!this._isSliding) {
|
||||||
|
this._slide(Direction.NEXT)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nextWhenVisible() {
|
||||||
|
// Don't call next when the page isn't visible
|
||||||
|
if (!document.hidden) {
|
||||||
|
this.next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
prev() {
|
||||||
|
if (!this._isSliding) {
|
||||||
|
this._slide(Direction.PREVIOUS)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pause(event) {
|
||||||
|
if (!event) {
|
||||||
|
this._isPaused = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($(this._element).find(Selector.NEXT_PREV)[0] &&
|
||||||
|
Util.supportsTransitionEnd()) {
|
||||||
|
Util.triggerTransitionEnd(this._element)
|
||||||
|
this.cycle(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
clearInterval(this._interval)
|
||||||
|
this._interval = null
|
||||||
|
}
|
||||||
|
|
||||||
|
cycle(event) {
|
||||||
|
if (!event) {
|
||||||
|
this._isPaused = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._interval) {
|
||||||
|
clearInterval(this._interval)
|
||||||
|
this._interval = null
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._config.interval && !this._isPaused) {
|
||||||
|
this._interval = setInterval(
|
||||||
|
$.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
to(index) {
|
||||||
|
this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0]
|
||||||
|
|
||||||
|
let activeIndex = this._getItemIndex(this._activeElement)
|
||||||
|
|
||||||
|
if (index > (this._items.length - 1) || index < 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._isSliding) {
|
||||||
|
$(this._element).one(Event.SLID, () => this.to(index))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeIndex === index) {
|
||||||
|
this.pause()
|
||||||
|
this.cycle()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let direction = index > activeIndex ?
|
||||||
|
Direction.NEXT :
|
||||||
|
Direction.PREVIOUS
|
||||||
|
|
||||||
|
this._slide(direction, this._items[index])
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
$(this._element).off(EVENT_KEY)
|
||||||
|
$.removeData(this._element, DATA_KEY)
|
||||||
|
|
||||||
|
this._items = null
|
||||||
|
this._config = null
|
||||||
|
this._element = null
|
||||||
|
this._interval = null
|
||||||
|
this._isPaused = null
|
||||||
|
this._isSliding = null
|
||||||
|
this._activeElement = null
|
||||||
|
this._indicatorsElement = null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
_getConfig(config) {
|
||||||
|
config = $.extend({}, Default, config)
|
||||||
|
Util.typeCheckConfig(NAME, config, DefaultType)
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
_addEventListeners() {
|
||||||
|
if (this._config.keyboard) {
|
||||||
|
$(this._element)
|
||||||
|
.on(Event.KEYDOWN, $.proxy(this._keydown, this))
|
||||||
|
}
|
||||||
|
|
||||||
|
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_keydown(event) {
|
||||||
|
event.preventDefault()
|
||||||
|
|
||||||
|
if (/input|textarea/i.test(event.target.tagName)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (event.which) {
|
||||||
|
case 37: this.prev(); break
|
||||||
|
case 39: this.next(); break
|
||||||
|
default: return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_getItemIndex(element) {
|
||||||
|
this._items = $.makeArray($(element).parent().find(Selector.ITEM))
|
||||||
|
return this._items.indexOf(element)
|
||||||
|
}
|
||||||
|
|
||||||
|
_getItemByDirection(direction, activeElement) {
|
||||||
|
let isNextDirection = direction === Direction.NEXT
|
||||||
|
let isPrevDirection = direction === Direction.PREVIOUS
|
||||||
|
let activeIndex = this._getItemIndex(activeElement)
|
||||||
|
let lastItemIndex = (this._items.length - 1)
|
||||||
|
let isGoingToWrap = (isPrevDirection && activeIndex === 0) ||
|
||||||
|
(isNextDirection && activeIndex === lastItemIndex)
|
||||||
|
|
||||||
|
if (isGoingToWrap && !this._config.wrap) {
|
||||||
|
return activeElement
|
||||||
|
}
|
||||||
|
|
||||||
|
let delta = direction === Direction.PREVIOUS ? -1 : 1
|
||||||
|
let itemIndex = (activeIndex + delta) % this._items.length
|
||||||
|
|
||||||
|
return itemIndex === -1 ?
|
||||||
|
this._items[this._items.length - 1] : this._items[itemIndex]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_triggerSlideEvent(relatedTarget, directionalClassname) {
|
||||||
|
let slideEvent = $.Event(Event.SLIDE, {
|
||||||
|
relatedTarget,
|
||||||
|
direction: directionalClassname
|
||||||
|
})
|
||||||
|
|
||||||
|
$(this._element).trigger(slideEvent)
|
||||||
|
|
||||||
|
return slideEvent
|
||||||
|
}
|
||||||
|
|
||||||
|
_setActiveIndicatorElement(element) {
|
||||||
|
if (this._indicatorsElement) {
|
||||||
|
$(this._indicatorsElement)
|
||||||
|
.find(Selector.ACTIVE)
|
||||||
|
.removeClass(ClassName.ACTIVE)
|
||||||
|
|
||||||
|
let nextIndicator = this._indicatorsElement.children[
|
||||||
|
this._getItemIndex(element)
|
||||||
|
]
|
||||||
|
|
||||||
|
if (nextIndicator) {
|
||||||
|
$(nextIndicator).addClass(ClassName.ACTIVE)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_slide(direction, element) {
|
||||||
|
let activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0]
|
||||||
|
let nextElement = element || activeElement &&
|
||||||
|
this._getItemByDirection(direction, activeElement)
|
||||||
|
|
||||||
|
let isCycling = Boolean(this._interval)
|
||||||
|
|
||||||
|
let directionalClassName = direction === Direction.NEXT ?
|
||||||
|
ClassName.LEFT :
|
||||||
|
ClassName.RIGHT
|
||||||
|
|
||||||
|
if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
|
||||||
|
this._isSliding = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let slideEvent = this._triggerSlideEvent(nextElement, directionalClassName)
|
||||||
|
if (slideEvent.isDefaultPrevented()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!activeElement || !nextElement) {
|
||||||
|
// some weirdness is happening, so we bail
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this._isSliding = true
|
||||||
|
|
||||||
|
if (isCycling) {
|
||||||
|
this.pause()
|
||||||
|
}
|
||||||
|
|
||||||
|
this._setActiveIndicatorElement(nextElement)
|
||||||
|
|
||||||
|
let slidEvent = $.Event(Event.SLID, {
|
||||||
|
relatedTarget: nextElement,
|
||||||
|
direction: directionalClassName
|
||||||
|
})
|
||||||
|
|
||||||
|
if (Util.supportsTransitionEnd() &&
|
||||||
|
$(this._element).hasClass(ClassName.SLIDE)) {
|
||||||
|
|
||||||
|
$(nextElement).addClass(direction)
|
||||||
|
|
||||||
|
Util.reflow(nextElement)
|
||||||
|
|
||||||
|
$(activeElement).addClass(directionalClassName)
|
||||||
|
$(nextElement).addClass(directionalClassName)
|
||||||
|
|
||||||
|
$(activeElement)
|
||||||
|
.one(Util.TRANSITION_END, () => {
|
||||||
|
$(nextElement)
|
||||||
|
.removeClass(directionalClassName)
|
||||||
|
.removeClass(direction)
|
||||||
|
|
||||||
|
$(nextElement).addClass(ClassName.ACTIVE)
|
||||||
|
|
||||||
|
$(activeElement)
|
||||||
|
.removeClass(ClassName.ACTIVE)
|
||||||
|
.removeClass(direction)
|
||||||
|
.removeClass(directionalClassName)
|
||||||
|
|
||||||
|
this._isSliding = false
|
||||||
|
|
||||||
|
setTimeout(() => $(this._element).trigger(slidEvent), 0)
|
||||||
|
|
||||||
|
})
|
||||||
|
.emulateTransitionEnd(TRANSITION_DURATION)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$(activeElement).removeClass(ClassName.ACTIVE)
|
||||||
|
$(nextElement).addClass(ClassName.ACTIVE)
|
||||||
|
|
||||||
|
this._isSliding = false
|
||||||
|
$(this._element).trigger(slidEvent)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isCycling) {
|
||||||
|
this.cycle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
static _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
let data = $(this).data(DATA_KEY)
|
||||||
|
let _config = $.extend({}, Default, $(this).data())
|
||||||
|
|
||||||
|
if (typeof config === 'object') {
|
||||||
|
$.extend(_config, config)
|
||||||
|
}
|
||||||
|
|
||||||
|
let action = typeof config === 'string' ? config : _config.slide
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Carousel(this, _config)
|
||||||
|
$(this).data(DATA_KEY, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'number') {
|
||||||
|
data.to(config)
|
||||||
|
} else if (typeof action === 'string') {
|
||||||
|
if (data[action] === undefined) {
|
||||||
|
throw new Error(`No method named "${action}"`)
|
||||||
|
}
|
||||||
|
data[action]()
|
||||||
|
} else if (_config.interval) {
|
||||||
|
data.pause()
|
||||||
|
data.cycle()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
static _dataApiClickHandler(event) {
|
||||||
|
let selector = Util.getSelectorFromElement(this)
|
||||||
|
|
||||||
|
if (!selector) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let target = $(selector)[0]
|
||||||
|
|
||||||
|
if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let config = $.extend({}, $(target).data(), $(this).data())
|
||||||
|
let slideIndex = this.getAttribute('data-slide-to')
|
||||||
|
|
||||||
|
if (slideIndex) {
|
||||||
|
config.interval = false
|
||||||
|
}
|
||||||
|
|
||||||
|
Carousel._jQueryInterface.call($(target), config)
|
||||||
|
|
||||||
|
if (slideIndex) {
|
||||||
|
$(target).data(DATA_KEY).to(slideIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$(document)
|
||||||
|
.on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)
|
||||||
|
|
||||||
|
$(window).on(Event.LOAD_DATA_API, () => {
|
||||||
|
$(Selector.DATA_RIDE).each(function () {
|
||||||
|
let $carousel = $(this)
|
||||||
|
Carousel._jQueryInterface.call($carousel, $carousel.data())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Carousel._jQueryInterface
|
||||||
|
$.fn[NAME].Constructor = Carousel
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT
|
||||||
|
return Carousel._jQueryInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
return Carousel
|
||||||
|
|
||||||
|
})(jQuery)
|
||||||
|
|
||||||
|
export default Carousel
|
|
@ -0,0 +1,381 @@
|
||||||
|
import Util from './util'
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): collapse.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Collapse = (($) => {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'collapse'
|
||||||
|
const VERSION = '4.0.0-alpha'
|
||||||
|
const DATA_KEY = 'bs.collapse'
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`
|
||||||
|
const DATA_API_KEY = '.data-api'
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
||||||
|
const TRANSITION_DURATION = 600
|
||||||
|
|
||||||
|
const Default = {
|
||||||
|
toggle : true,
|
||||||
|
parent : ''
|
||||||
|
}
|
||||||
|
|
||||||
|
const DefaultType = {
|
||||||
|
toggle : 'boolean',
|
||||||
|
parent : 'string'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Event = {
|
||||||
|
SHOW : `show${EVENT_KEY}`,
|
||||||
|
SHOWN : `shown${EVENT_KEY}`,
|
||||||
|
HIDE : `hide${EVENT_KEY}`,
|
||||||
|
HIDDEN : `hidden${EVENT_KEY}`,
|
||||||
|
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const ClassName = {
|
||||||
|
IN : 'in',
|
||||||
|
COLLAPSE : 'collapse',
|
||||||
|
COLLAPSING : 'collapsing',
|
||||||
|
COLLAPSED : 'collapsed'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Dimension = {
|
||||||
|
WIDTH : 'width',
|
||||||
|
HEIGHT : 'height'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Selector = {
|
||||||
|
ACTIVES : '.panel > .in, .panel > .collapsing',
|
||||||
|
DATA_TOGGLE : '[data-toggle="collapse"]'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Collapse {
|
||||||
|
|
||||||
|
constructor(element, config) {
|
||||||
|
this._isTransitioning = false
|
||||||
|
this._element = element
|
||||||
|
this._config = this._getConfig(config)
|
||||||
|
this._triggerArray = $.makeArray($(
|
||||||
|
`[data-toggle="collapse"][href="#${element.id}"],` +
|
||||||
|
`[data-toggle="collapse"][data-target="#${element.id}"]`
|
||||||
|
))
|
||||||
|
|
||||||
|
this._parent = this._config.parent ? this._getParent() : null
|
||||||
|
|
||||||
|
if (!this._config.parent) {
|
||||||
|
this._addAriaAndCollapsedClass(this._element, this._triggerArray)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._config.toggle) {
|
||||||
|
this.toggle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
static get VERSION() {
|
||||||
|
return VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
static get Default() {
|
||||||
|
return Default
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
toggle() {
|
||||||
|
if ($(this._element).hasClass(ClassName.IN)) {
|
||||||
|
this.hide()
|
||||||
|
} else {
|
||||||
|
this.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
show() {
|
||||||
|
if (this._isTransitioning ||
|
||||||
|
$(this._element).hasClass(ClassName.IN)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let actives
|
||||||
|
let activesData
|
||||||
|
|
||||||
|
if (this._parent) {
|
||||||
|
actives = $.makeArray($(Selector.ACTIVES))
|
||||||
|
if (!actives.length) {
|
||||||
|
actives = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (actives) {
|
||||||
|
activesData = $(actives).data(DATA_KEY)
|
||||||
|
if (activesData && activesData._isTransitioning) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let startEvent = $.Event(Event.SHOW)
|
||||||
|
$(this._element).trigger(startEvent)
|
||||||
|
if (startEvent.isDefaultPrevented()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (actives) {
|
||||||
|
Collapse._jQueryInterface.call($(actives), 'hide')
|
||||||
|
if (!activesData) {
|
||||||
|
$(actives).data(DATA_KEY, null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let dimension = this._getDimension()
|
||||||
|
|
||||||
|
$(this._element)
|
||||||
|
.removeClass(ClassName.COLLAPSE)
|
||||||
|
.addClass(ClassName.COLLAPSING)
|
||||||
|
|
||||||
|
this._element.style[dimension] = 0
|
||||||
|
this._element.setAttribute('aria-expanded', true)
|
||||||
|
|
||||||
|
if (this._triggerArray.length) {
|
||||||
|
$(this._triggerArray)
|
||||||
|
.removeClass(ClassName.COLLAPSED)
|
||||||
|
.attr('aria-expanded', true)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setTransitioning(true)
|
||||||
|
|
||||||
|
let complete = () => {
|
||||||
|
$(this._element)
|
||||||
|
.removeClass(ClassName.COLLAPSING)
|
||||||
|
.addClass(ClassName.COLLAPSE)
|
||||||
|
.addClass(ClassName.IN)
|
||||||
|
|
||||||
|
this._element.style[dimension] = ''
|
||||||
|
|
||||||
|
this.setTransitioning(false)
|
||||||
|
|
||||||
|
$(this._element).trigger(Event.SHOWN)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Util.supportsTransitionEnd()) {
|
||||||
|
complete()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)
|
||||||
|
let scrollSize = `scroll${capitalizedDimension}`
|
||||||
|
|
||||||
|
$(this._element)
|
||||||
|
.one(Util.TRANSITION_END, complete)
|
||||||
|
.emulateTransitionEnd(TRANSITION_DURATION)
|
||||||
|
|
||||||
|
this._element.style[dimension] = `${this._element[scrollSize]}px`
|
||||||
|
}
|
||||||
|
|
||||||
|
hide() {
|
||||||
|
if (this._isTransitioning ||
|
||||||
|
!$(this._element).hasClass(ClassName.IN)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let startEvent = $.Event(Event.HIDE)
|
||||||
|
$(this._element).trigger(startEvent)
|
||||||
|
if (startEvent.isDefaultPrevented()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let dimension = this._getDimension()
|
||||||
|
let offsetDimension = dimension === Dimension.WIDTH ?
|
||||||
|
'offsetWidth' : 'offsetHeight'
|
||||||
|
|
||||||
|
this._element.style[dimension] = `${this._element[offsetDimension]}px`
|
||||||
|
|
||||||
|
Util.reflow(this._element)
|
||||||
|
|
||||||
|
$(this._element)
|
||||||
|
.addClass(ClassName.COLLAPSING)
|
||||||
|
.removeClass(ClassName.COLLAPSE)
|
||||||
|
.removeClass(ClassName.IN)
|
||||||
|
|
||||||
|
this._element.setAttribute('aria-expanded', false)
|
||||||
|
|
||||||
|
if (this._triggerArray.length) {
|
||||||
|
$(this._triggerArray)
|
||||||
|
.addClass(ClassName.COLLAPSED)
|
||||||
|
.attr('aria-expanded', false)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setTransitioning(true)
|
||||||
|
|
||||||
|
let complete = () => {
|
||||||
|
this.setTransitioning(false)
|
||||||
|
$(this._element)
|
||||||
|
.removeClass(ClassName.COLLAPSING)
|
||||||
|
.addClass(ClassName.COLLAPSE)
|
||||||
|
.trigger(Event.HIDDEN)
|
||||||
|
}
|
||||||
|
|
||||||
|
this._element.style[dimension] = 0
|
||||||
|
|
||||||
|
if (!Util.supportsTransitionEnd()) {
|
||||||
|
complete()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._element)
|
||||||
|
.one(Util.TRANSITION_END, complete)
|
||||||
|
.emulateTransitionEnd(TRANSITION_DURATION)
|
||||||
|
}
|
||||||
|
|
||||||
|
setTransitioning(isTransitioning) {
|
||||||
|
this._isTransitioning = isTransitioning
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
$.removeData(this._element, DATA_KEY)
|
||||||
|
|
||||||
|
this._config = null
|
||||||
|
this._parent = null
|
||||||
|
this._element = null
|
||||||
|
this._triggerArray = null
|
||||||
|
this._isTransitioning = null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
_getConfig(config) {
|
||||||
|
config = $.extend({}, Default, config)
|
||||||
|
config.toggle = Boolean(config.toggle) // coerce string values
|
||||||
|
Util.typeCheckConfig(NAME, config, DefaultType)
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
_getDimension() {
|
||||||
|
let hasWidth = $(this._element).hasClass(Dimension.WIDTH)
|
||||||
|
return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT
|
||||||
|
}
|
||||||
|
|
||||||
|
_getParent() {
|
||||||
|
let parent = $(this._config.parent)[0]
|
||||||
|
let selector =
|
||||||
|
`[data-toggle="collapse"][data-parent="${this._config.parent}"]`
|
||||||
|
|
||||||
|
$(parent).find(selector).each((i, element) => {
|
||||||
|
this._addAriaAndCollapsedClass(
|
||||||
|
Collapse._getTargetFromElement(element),
|
||||||
|
[element]
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
return parent
|
||||||
|
}
|
||||||
|
|
||||||
|
_addAriaAndCollapsedClass(element, triggerArray) {
|
||||||
|
if (element) {
|
||||||
|
let isOpen = $(element).hasClass(ClassName.IN)
|
||||||
|
element.setAttribute('aria-expanded', isOpen)
|
||||||
|
|
||||||
|
if (triggerArray.length) {
|
||||||
|
$(triggerArray)
|
||||||
|
.toggleClass(ClassName.COLLAPSED, !isOpen)
|
||||||
|
.attr('aria-expanded', isOpen)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
static _getTargetFromElement(element) {
|
||||||
|
let selector = Util.getSelectorFromElement(element)
|
||||||
|
return selector ? $(selector)[0] : null
|
||||||
|
}
|
||||||
|
|
||||||
|
static _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
let $this = $(this)
|
||||||
|
let data = $this.data(DATA_KEY)
|
||||||
|
let _config = $.extend(
|
||||||
|
{},
|
||||||
|
Default,
|
||||||
|
$this.data(),
|
||||||
|
typeof config === 'object' && config
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!data && _config.toggle && /show|hide/.test(config)) {
|
||||||
|
_config.toggle = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Collapse(this, _config)
|
||||||
|
$this.data(DATA_KEY, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error(`No method named "${config}"`)
|
||||||
|
}
|
||||||
|
data[config]()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
||||||
|
event.preventDefault()
|
||||||
|
|
||||||
|
let target = Collapse._getTargetFromElement(this)
|
||||||
|
let data = $(target).data(DATA_KEY)
|
||||||
|
let config = data ? 'toggle' : $(this).data()
|
||||||
|
|
||||||
|
Collapse._jQueryInterface.call($(target), config)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Collapse._jQueryInterface
|
||||||
|
$.fn[NAME].Constructor = Collapse
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT
|
||||||
|
return Collapse._jQueryInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
return Collapse
|
||||||
|
|
||||||
|
})(jQuery)
|
||||||
|
|
||||||
|
export default Collapse
|
|
@ -0,0 +1,297 @@
|
||||||
|
import Util from './util'
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): dropdown.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Dropdown = (($) => {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'dropdown'
|
||||||
|
const VERSION = '4.0.0-alpha'
|
||||||
|
const DATA_KEY = 'bs.dropdown'
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`
|
||||||
|
const DATA_API_KEY = '.data-api'
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
||||||
|
|
||||||
|
const Event = {
|
||||||
|
HIDE : `hide${EVENT_KEY}`,
|
||||||
|
HIDDEN : `hidden${EVENT_KEY}`,
|
||||||
|
SHOW : `show${EVENT_KEY}`,
|
||||||
|
SHOWN : `shown${EVENT_KEY}`,
|
||||||
|
CLICK : `click${EVENT_KEY}`,
|
||||||
|
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
|
||||||
|
KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const ClassName = {
|
||||||
|
BACKDROP : 'dropdown-backdrop',
|
||||||
|
DISABLED : 'disabled',
|
||||||
|
OPEN : 'open'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Selector = {
|
||||||
|
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'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Dropdown {
|
||||||
|
|
||||||
|
constructor(element) {
|
||||||
|
this._element = element
|
||||||
|
|
||||||
|
this._addEventListeners()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
static get VERSION() {
|
||||||
|
return VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
toggle() {
|
||||||
|
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
let parent = Dropdown._getParentFromElement(this)
|
||||||
|
let isActive = $(parent).hasClass(ClassName.OPEN)
|
||||||
|
|
||||||
|
Dropdown._clearMenus()
|
||||||
|
|
||||||
|
if (isActive) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if ('ontouchstart' in document.documentElement &&
|
||||||
|
(!$(parent).closest(Selector.NAVBAR_NAV).length)) {
|
||||||
|
|
||||||
|
// if mobile we use a backdrop because click events don't delegate
|
||||||
|
let dropdown = document.createElement('div')
|
||||||
|
dropdown.className = ClassName.BACKDROP
|
||||||
|
$(dropdown).insertBefore(this)
|
||||||
|
$(dropdown).on('click', Dropdown._clearMenus)
|
||||||
|
}
|
||||||
|
|
||||||
|
let relatedTarget = { relatedTarget : this }
|
||||||
|
let showEvent = $.Event(Event.SHOW, relatedTarget)
|
||||||
|
|
||||||
|
$(parent).trigger(showEvent)
|
||||||
|
|
||||||
|
if (showEvent.isDefaultPrevented()) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
this.focus()
|
||||||
|
this.setAttribute('aria-expanded', 'true')
|
||||||
|
|
||||||
|
$(parent).toggleClass(ClassName.OPEN)
|
||||||
|
$(parent).trigger($.Event(Event.SHOWN, relatedTarget))
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
$.removeData(this._element, DATA_KEY)
|
||||||
|
$(this._element).off(EVENT_KEY)
|
||||||
|
this._element = null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
_addEventListeners() {
|
||||||
|
$(this._element).on(Event.CLICK, this.toggle)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
static _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
let data = $(this).data(DATA_KEY)
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
$(this).data(DATA_KEY, (data = new Dropdown(this)))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error(`No method named "${config}"`)
|
||||||
|
}
|
||||||
|
data[config].call(this)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
static _clearMenus(event) {
|
||||||
|
if (event && event.which === 3) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let backdrop = $(Selector.BACKDROP)[0]
|
||||||
|
if (backdrop) {
|
||||||
|
backdrop.parentNode.removeChild(backdrop)
|
||||||
|
}
|
||||||
|
|
||||||
|
let toggles = $.makeArray($(Selector.DATA_TOGGLE))
|
||||||
|
|
||||||
|
for (let i = 0; i < toggles.length; i++) {
|
||||||
|
let parent = Dropdown._getParentFromElement(toggles[i])
|
||||||
|
let relatedTarget = { relatedTarget : toggles[i] }
|
||||||
|
|
||||||
|
if (!$(parent).hasClass(ClassName.OPEN)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event && event.type === 'click' &&
|
||||||
|
(/input|textarea/i.test(event.target.tagName)) &&
|
||||||
|
($.contains(parent, event.target))) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
let hideEvent = $.Event(Event.HIDE, relatedTarget)
|
||||||
|
$(parent).trigger(hideEvent)
|
||||||
|
if (hideEvent.isDefaultPrevented()) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
toggles[i].setAttribute('aria-expanded', 'false')
|
||||||
|
|
||||||
|
$(parent)
|
||||||
|
.removeClass(ClassName.OPEN)
|
||||||
|
.trigger($.Event(Event.HIDDEN, relatedTarget))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static _getParentFromElement(element) {
|
||||||
|
let parent
|
||||||
|
let selector = Util.getSelectorFromElement(element)
|
||||||
|
|
||||||
|
if (selector) {
|
||||||
|
parent = $(selector)[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent || element.parentNode
|
||||||
|
}
|
||||||
|
|
||||||
|
static _dataApiKeydownHandler(event) {
|
||||||
|
if (!/(38|40|27|32)/.test(event.which) ||
|
||||||
|
/input|textarea/i.test(event.target.tagName)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault()
|
||||||
|
event.stopPropagation()
|
||||||
|
|
||||||
|
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let parent = Dropdown._getParentFromElement(this)
|
||||||
|
let isActive = $(parent).hasClass(ClassName.OPEN)
|
||||||
|
|
||||||
|
if ((!isActive && event.which !== 27) ||
|
||||||
|
(isActive && event.which === 27)) {
|
||||||
|
|
||||||
|
if (event.which === 27) {
|
||||||
|
let toggle = $(parent).find(Selector.DATA_TOGGLE)[0]
|
||||||
|
$(toggle).trigger('focus')
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this).trigger('click')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let items = $.makeArray($(Selector.VISIBLE_ITEMS))
|
||||||
|
|
||||||
|
items = items.filter((item) => {
|
||||||
|
return item.offsetWidth || item.offsetHeight
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!items.length) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let index = items.indexOf(event.target)
|
||||||
|
|
||||||
|
if (event.which === 38 && index > 0) { // up
|
||||||
|
index--
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.which === 40 && index < items.length - 1) { // down
|
||||||
|
index++
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!~index) {
|
||||||
|
index = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
items[index].focus()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$(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, (e) => {
|
||||||
|
e.stopPropagation()
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Dropdown._jQueryInterface
|
||||||
|
$.fn[NAME].Constructor = Dropdown
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT
|
||||||
|
return Dropdown._jQueryInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
return Dropdown
|
||||||
|
|
||||||
|
})(jQuery)
|
||||||
|
|
||||||
|
export default Dropdown
|
|
@ -0,0 +1,534 @@
|
||||||
|
import Util from './util'
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): modal.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Modal = (($) => {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'modal'
|
||||||
|
const VERSION = '4.0.0-alpha'
|
||||||
|
const DATA_KEY = 'bs.modal'
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`
|
||||||
|
const DATA_API_KEY = '.data-api'
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
||||||
|
const TRANSITION_DURATION = 300
|
||||||
|
const BACKDROP_TRANSITION_DURATION = 150
|
||||||
|
|
||||||
|
const Default = {
|
||||||
|
backdrop : true,
|
||||||
|
keyboard : true,
|
||||||
|
focus : true,
|
||||||
|
show : true
|
||||||
|
}
|
||||||
|
|
||||||
|
const DefaultType = {
|
||||||
|
backdrop : '(boolean|string)',
|
||||||
|
keyboard : 'boolean',
|
||||||
|
focus : 'boolean',
|
||||||
|
show : 'boolean'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Event = {
|
||||||
|
HIDE : `hide${EVENT_KEY}`,
|
||||||
|
HIDDEN : `hidden${EVENT_KEY}`,
|
||||||
|
SHOW : `show${EVENT_KEY}`,
|
||||||
|
SHOWN : `shown${EVENT_KEY}`,
|
||||||
|
FOCUSIN : `focusin${EVENT_KEY}`,
|
||||||
|
RESIZE : `resize${EVENT_KEY}`,
|
||||||
|
CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,
|
||||||
|
KEYDOWN_DISMISS : `keydown.dismiss${EVENT_KEY}`,
|
||||||
|
MOUSEUP_DISMISS : `mouseup.dismiss${EVENT_KEY}`,
|
||||||
|
MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,
|
||||||
|
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const ClassName = {
|
||||||
|
SCROLLBAR_MEASURER : 'modal-scrollbar-measure',
|
||||||
|
BACKDROP : 'modal-backdrop',
|
||||||
|
OPEN : 'modal-open',
|
||||||
|
FADE : 'fade',
|
||||||
|
IN : 'in'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Selector = {
|
||||||
|
DIALOG : '.modal-dialog',
|
||||||
|
DATA_TOGGLE : '[data-toggle="modal"]',
|
||||||
|
DATA_DISMISS : '[data-dismiss="modal"]',
|
||||||
|
FIXED_CONTENT : '.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Modal {
|
||||||
|
|
||||||
|
constructor(element, config) {
|
||||||
|
this._config = this._getConfig(config)
|
||||||
|
this._element = element
|
||||||
|
this._dialog = $(element).find(Selector.DIALOG)[0]
|
||||||
|
this._backdrop = null
|
||||||
|
this._isShown = false
|
||||||
|
this._isBodyOverflowing = false
|
||||||
|
this._ignoreBackdropClick = false
|
||||||
|
this._originalBodyPadding = 0
|
||||||
|
this._scrollbarWidth = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
static get VERSION() {
|
||||||
|
return VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
static get Default() {
|
||||||
|
return Default
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
toggle(relatedTarget) {
|
||||||
|
return this._isShown ? this.hide() : this.show(relatedTarget)
|
||||||
|
}
|
||||||
|
|
||||||
|
show(relatedTarget) {
|
||||||
|
let showEvent = $.Event(Event.SHOW, {
|
||||||
|
relatedTarget
|
||||||
|
})
|
||||||
|
|
||||||
|
$(this._element).trigger(showEvent)
|
||||||
|
|
||||||
|
if (this._isShown || showEvent.isDefaultPrevented()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this._isShown = true
|
||||||
|
|
||||||
|
this._checkScrollbar()
|
||||||
|
this._setScrollbar()
|
||||||
|
|
||||||
|
$(document.body).addClass(ClassName.OPEN)
|
||||||
|
|
||||||
|
this._setEscapeEvent()
|
||||||
|
this._setResizeEvent()
|
||||||
|
|
||||||
|
$(this._element).on(
|
||||||
|
Event.CLICK_DISMISS,
|
||||||
|
Selector.DATA_DISMISS,
|
||||||
|
$.proxy(this.hide, this)
|
||||||
|
)
|
||||||
|
|
||||||
|
$(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {
|
||||||
|
$(this._element).one(Event.MOUSEUP_DISMISS, (event) => {
|
||||||
|
if ($(event.target).is(this._element)) {
|
||||||
|
this._ignoreBackdropClick = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
this._showBackdrop(
|
||||||
|
$.proxy(this._showElement, this, relatedTarget)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
hide(event) {
|
||||||
|
if (event) {
|
||||||
|
event.preventDefault()
|
||||||
|
}
|
||||||
|
|
||||||
|
let hideEvent = $.Event(Event.HIDE)
|
||||||
|
|
||||||
|
$(this._element).trigger(hideEvent)
|
||||||
|
|
||||||
|
if (!this._isShown || hideEvent.isDefaultPrevented()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this._isShown = false
|
||||||
|
|
||||||
|
this._setEscapeEvent()
|
||||||
|
this._setResizeEvent()
|
||||||
|
|
||||||
|
$(document).off(Event.FOCUSIN)
|
||||||
|
|
||||||
|
$(this._element).removeClass(ClassName.IN)
|
||||||
|
|
||||||
|
$(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)
|
||||||
|
} else {
|
||||||
|
this._hideModal()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
$.removeData(this._element, DATA_KEY)
|
||||||
|
|
||||||
|
$(window).off(EVENT_KEY)
|
||||||
|
$(document).off(EVENT_KEY)
|
||||||
|
$(this._element).off(EVENT_KEY)
|
||||||
|
$(this._backdrop).off(EVENT_KEY)
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
_getConfig(config) {
|
||||||
|
config = $.extend({}, Default, config)
|
||||||
|
Util.typeCheckConfig(NAME, config, DefaultType)
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
_showElement(relatedTarget) {
|
||||||
|
let transition = Util.supportsTransitionEnd() &&
|
||||||
|
$(this._element).hasClass(ClassName.FADE)
|
||||||
|
|
||||||
|
if (!this._element.parentNode ||
|
||||||
|
(this._element.parentNode.nodeType !== Node.ELEMENT_NODE)) {
|
||||||
|
// don't move modals dom position
|
||||||
|
document.body.appendChild(this._element)
|
||||||
|
}
|
||||||
|
|
||||||
|
this._element.style.display = 'block'
|
||||||
|
this._element.scrollTop = 0
|
||||||
|
|
||||||
|
if (transition) {
|
||||||
|
Util.reflow(this._element)
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._element).addClass(ClassName.IN)
|
||||||
|
|
||||||
|
if (this._config.focus) {
|
||||||
|
this._enforceFocus()
|
||||||
|
}
|
||||||
|
|
||||||
|
let shownEvent = $.Event(Event.SHOWN, {
|
||||||
|
relatedTarget
|
||||||
|
})
|
||||||
|
|
||||||
|
let transitionComplete = () => {
|
||||||
|
if (this._config.focus) {
|
||||||
|
this._element.focus()
|
||||||
|
}
|
||||||
|
$(this._element).trigger(shownEvent)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (transition) {
|
||||||
|
$(this._dialog)
|
||||||
|
.one(Util.TRANSITION_END, transitionComplete)
|
||||||
|
.emulateTransitionEnd(TRANSITION_DURATION)
|
||||||
|
} else {
|
||||||
|
transitionComplete()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_enforceFocus() {
|
||||||
|
$(document)
|
||||||
|
.off(Event.FOCUSIN) // guard against infinite focus loop
|
||||||
|
.on(Event.FOCUSIN, (event) => {
|
||||||
|
if (this._element !== event.target &&
|
||||||
|
(!$(this._element).has(event.target).length)) {
|
||||||
|
this._element.focus()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
_setEscapeEvent() {
|
||||||
|
if (this._isShown && this._config.keyboard) {
|
||||||
|
$(this._element).on(Event.KEYDOWN_DISMISS, (event) => {
|
||||||
|
if (event.which === 27) {
|
||||||
|
this.hide()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
} else if (!this._isShown) {
|
||||||
|
$(this._element).off(Event.KEYDOWN_DISMISS)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_setResizeEvent() {
|
||||||
|
if (this._isShown) {
|
||||||
|
$(window).on(Event.RESIZE, $.proxy(this._handleUpdate, this))
|
||||||
|
} else {
|
||||||
|
$(window).off(Event.RESIZE)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_hideModal() {
|
||||||
|
this._element.style.display = 'none'
|
||||||
|
this._showBackdrop(() => {
|
||||||
|
$(document.body).removeClass(ClassName.OPEN)
|
||||||
|
this._resetAdjustments()
|
||||||
|
this._resetScrollbar()
|
||||||
|
$(this._element).trigger(Event.HIDDEN)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
_removeBackdrop() {
|
||||||
|
if (this._backdrop) {
|
||||||
|
$(this._backdrop).remove()
|
||||||
|
this._backdrop = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_showBackdrop(callback) {
|
||||||
|
let animate = $(this._element).hasClass(ClassName.FADE) ?
|
||||||
|
ClassName.FADE : ''
|
||||||
|
|
||||||
|
if (this._isShown && this._config.backdrop) {
|
||||||
|
let doAnimate = Util.supportsTransitionEnd() && animate
|
||||||
|
|
||||||
|
this._backdrop = document.createElement('div')
|
||||||
|
this._backdrop.className = ClassName.BACKDROP
|
||||||
|
|
||||||
|
if (animate) {
|
||||||
|
$(this._backdrop).addClass(animate)
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._backdrop).appendTo(document.body)
|
||||||
|
|
||||||
|
$(this._element).on(Event.CLICK_DISMISS, (event) => {
|
||||||
|
if (this._ignoreBackdropClick) {
|
||||||
|
this._ignoreBackdropClick = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (event.target !== event.currentTarget) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (this._config.backdrop === 'static') {
|
||||||
|
this._element.focus()
|
||||||
|
} else {
|
||||||
|
this.hide()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (doAnimate) {
|
||||||
|
Util.reflow(this._backdrop)
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._backdrop).addClass(ClassName.IN)
|
||||||
|
|
||||||
|
if (!callback) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!doAnimate) {
|
||||||
|
callback()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._backdrop)
|
||||||
|
.one(Util.TRANSITION_END, callback)
|
||||||
|
.emulateTransitionEnd(BACKDROP_TRANSITION_DURATION)
|
||||||
|
|
||||||
|
} else if (!this._isShown && this._backdrop) {
|
||||||
|
$(this._backdrop).removeClass(ClassName.IN)
|
||||||
|
|
||||||
|
let callbackRemove = () => {
|
||||||
|
this._removeBackdrop()
|
||||||
|
if (callback) {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Util.supportsTransitionEnd() &&
|
||||||
|
($(this._element).hasClass(ClassName.FADE))) {
|
||||||
|
$(this._backdrop)
|
||||||
|
.one(Util.TRANSITION_END, callbackRemove)
|
||||||
|
.emulateTransitionEnd(BACKDROP_TRANSITION_DURATION)
|
||||||
|
} else {
|
||||||
|
callbackRemove()
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (callback) {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
// the following methods are used to handle overflowing modals
|
||||||
|
// todo (fat): these should probably be refactored out of modal.js
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
_handleUpdate() {
|
||||||
|
this._adjustDialog()
|
||||||
|
}
|
||||||
|
|
||||||
|
_adjustDialog() {
|
||||||
|
let isModalOverflowing =
|
||||||
|
this._element.scrollHeight > document.documentElement.clientHeight
|
||||||
|
|
||||||
|
if (!this._isBodyOverflowing && isModalOverflowing) {
|
||||||
|
this._element.style.paddingLeft = `${this._scrollbarWidth}px`
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._isBodyOverflowing && !isModalOverflowing) {
|
||||||
|
this._element.style.paddingRight = `${this._scrollbarWidth}px~`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_resetAdjustments() {
|
||||||
|
this._element.style.paddingLeft = ''
|
||||||
|
this._element.style.paddingRight = ''
|
||||||
|
}
|
||||||
|
|
||||||
|
_checkScrollbar() {
|
||||||
|
let fullWindowWidth = window.innerWidth
|
||||||
|
if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
|
||||||
|
let documentElementRect = document.documentElement.getBoundingClientRect()
|
||||||
|
fullWindowWidth =
|
||||||
|
documentElementRect.right - Math.abs(documentElementRect.left)
|
||||||
|
}
|
||||||
|
this._isBodyOverflowing = document.body.clientWidth < fullWindowWidth
|
||||||
|
this._scrollbarWidth = this._getScrollbarWidth()
|
||||||
|
}
|
||||||
|
|
||||||
|
_setScrollbar() {
|
||||||
|
let bodyPadding = parseInt(
|
||||||
|
$(Selector.FIXED_CONTENT).css('padding-right') || 0,
|
||||||
|
10
|
||||||
|
)
|
||||||
|
|
||||||
|
this._originalBodyPadding = document.body.style.paddingRight || ''
|
||||||
|
|
||||||
|
if (this._isBodyOverflowing) {
|
||||||
|
document.body.style.paddingRight =
|
||||||
|
`${bodyPadding + this._scrollbarWidth}px`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_resetScrollbar() {
|
||||||
|
document.body.style.paddingRight = this._originalBodyPadding
|
||||||
|
}
|
||||||
|
|
||||||
|
_getScrollbarWidth() { // thx d.walsh
|
||||||
|
let scrollDiv = document.createElement('div')
|
||||||
|
scrollDiv.className = ClassName.SCROLLBAR_MEASURER
|
||||||
|
document.body.appendChild(scrollDiv)
|
||||||
|
let scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
|
||||||
|
document.body.removeChild(scrollDiv)
|
||||||
|
return scrollbarWidth
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
static _jQueryInterface(config, relatedTarget) {
|
||||||
|
return this.each(function () {
|
||||||
|
let data = $(this).data(DATA_KEY)
|
||||||
|
let _config = $.extend(
|
||||||
|
{},
|
||||||
|
Modal.Default,
|
||||||
|
$(this).data(),
|
||||||
|
typeof config === 'object' && config
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Modal(this, _config)
|
||||||
|
$(this).data(DATA_KEY, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error(`No method named "${config}"`)
|
||||||
|
}
|
||||||
|
data[config](relatedTarget)
|
||||||
|
} else if (_config.show) {
|
||||||
|
data.show(relatedTarget)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
||||||
|
let target
|
||||||
|
let selector = Util.getSelectorFromElement(this)
|
||||||
|
|
||||||
|
if (selector) {
|
||||||
|
target = $(selector)[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
let config = $(target).data(DATA_KEY) ?
|
||||||
|
'toggle' : $.extend({}, $(target).data(), $(this).data())
|
||||||
|
|
||||||
|
if (this.tagName === 'A') {
|
||||||
|
event.preventDefault()
|
||||||
|
}
|
||||||
|
|
||||||
|
let $target = $(target).one(Event.SHOW, (showEvent) => {
|
||||||
|
if (showEvent.isDefaultPrevented()) {
|
||||||
|
// only register focus restorer if modal will actually get shown
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
$target.one(Event.HIDDEN, () => {
|
||||||
|
if ($(this).is(':visible')) {
|
||||||
|
this.focus()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
Modal._jQueryInterface.call($(target), config, this)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Modal._jQueryInterface
|
||||||
|
$.fn[NAME].Constructor = Modal
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT
|
||||||
|
return Modal._jQueryInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
return Modal
|
||||||
|
|
||||||
|
})(jQuery)
|
||||||
|
|
||||||
|
export default Modal
|
|
@ -0,0 +1,183 @@
|
||||||
|
import Tooltip from './tooltip'
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): popover.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Popover = (($) => {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'popover'
|
||||||
|
const VERSION = '4.0.0-alpha'
|
||||||
|
const DATA_KEY = 'bs.popover'
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
||||||
|
|
||||||
|
const Default = $.extend({}, Tooltip.Default, {
|
||||||
|
placement : 'right',
|
||||||
|
trigger : 'click',
|
||||||
|
content : '',
|
||||||
|
template : '<div class="popover" role="tooltip">'
|
||||||
|
+ '<div class="popover-arrow"></div>'
|
||||||
|
+ '<h3 class="popover-title"></h3>'
|
||||||
|
+ '<div class="popover-content"></div></div>'
|
||||||
|
})
|
||||||
|
|
||||||
|
const DefaultType = $.extend({}, Tooltip.DefaultType, {
|
||||||
|
content : '(string|element|function)'
|
||||||
|
})
|
||||||
|
|
||||||
|
const ClassName = {
|
||||||
|
FADE : 'fade',
|
||||||
|
IN : 'in'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Selector = {
|
||||||
|
TITLE : '.popover-title',
|
||||||
|
CONTENT : '.popover-content',
|
||||||
|
ARROW : '.popover-arrow'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Event = {
|
||||||
|
HIDE : `hide${EVENT_KEY}`,
|
||||||
|
HIDDEN : `hidden${EVENT_KEY}`,
|
||||||
|
SHOW : `show${EVENT_KEY}`,
|
||||||
|
SHOWN : `shown${EVENT_KEY}`,
|
||||||
|
INSERTED : `inserted${EVENT_KEY}`,
|
||||||
|
CLICK : `click${EVENT_KEY}`,
|
||||||
|
FOCUSIN : `focusin${EVENT_KEY}`,
|
||||||
|
FOCUSOUT : `focusout${EVENT_KEY}`,
|
||||||
|
MOUSEENTER : `mouseenter${EVENT_KEY}`,
|
||||||
|
MOUSELEAVE : `mouseleave${EVENT_KEY}`
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Popover extends Tooltip {
|
||||||
|
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
static get VERSION() {
|
||||||
|
return VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
static get Default() {
|
||||||
|
return Default
|
||||||
|
}
|
||||||
|
|
||||||
|
static get NAME() {
|
||||||
|
return NAME
|
||||||
|
}
|
||||||
|
|
||||||
|
static get DATA_KEY() {
|
||||||
|
return DATA_KEY
|
||||||
|
}
|
||||||
|
|
||||||
|
static get Event() {
|
||||||
|
return Event
|
||||||
|
}
|
||||||
|
|
||||||
|
static get EVENT_KEY() {
|
||||||
|
return EVENT_KEY
|
||||||
|
}
|
||||||
|
|
||||||
|
static get DefaultType() {
|
||||||
|
return DefaultType
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// overrides
|
||||||
|
|
||||||
|
isWithContent() {
|
||||||
|
return this.getTitle() || this._getContent()
|
||||||
|
}
|
||||||
|
|
||||||
|
getTipElement() {
|
||||||
|
return (this.tip = this.tip || $(this.config.template)[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
setContent() {
|
||||||
|
let $tip = $(this.getTipElement())
|
||||||
|
|
||||||
|
// we use append for html objects to maintain js events
|
||||||
|
this.setElementContent($tip.find(Selector.TITLE), this.getTitle())
|
||||||
|
this.setElementContent($tip.find(Selector.CONTENT), this._getContent())
|
||||||
|
|
||||||
|
$tip
|
||||||
|
.removeClass(ClassName.FADE)
|
||||||
|
.removeClass(ClassName.IN)
|
||||||
|
|
||||||
|
this.cleanupTether()
|
||||||
|
}
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
_getContent() {
|
||||||
|
return this.element.getAttribute('data-content')
|
||||||
|
|| (typeof this.config.content === 'function' ?
|
||||||
|
this.config.content.call(this.element) :
|
||||||
|
this.config.content)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
static _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
let data = $(this).data(DATA_KEY)
|
||||||
|
let _config = typeof config === 'object' ? config : null
|
||||||
|
|
||||||
|
if (!data && /destroy|hide/.test(config)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Popover(this, _config)
|
||||||
|
$(this).data(DATA_KEY, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error(`No method named "${config}"`)
|
||||||
|
}
|
||||||
|
data[config]()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Popover._jQueryInterface
|
||||||
|
$.fn[NAME].Constructor = Popover
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT
|
||||||
|
return Popover._jQueryInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
return Popover
|
||||||
|
|
||||||
|
})(jQuery)
|
||||||
|
|
||||||
|
export default Popover
|
|
@ -0,0 +1,325 @@
|
||||||
|
import Util from './util'
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): scrollspy.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const ScrollSpy = (($) => {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'scrollspy'
|
||||||
|
const VERSION = '4.0.0-alpha'
|
||||||
|
const DATA_KEY = 'bs.scrollspy'
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`
|
||||||
|
const DATA_API_KEY = '.data-api'
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
||||||
|
|
||||||
|
const Default = {
|
||||||
|
offset : 10,
|
||||||
|
method : 'auto',
|
||||||
|
target : ''
|
||||||
|
}
|
||||||
|
|
||||||
|
const DefaultType = {
|
||||||
|
offset : 'number',
|
||||||
|
method : 'string',
|
||||||
|
target : '(string|element)'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Event = {
|
||||||
|
ACTIVATE : `activate${EVENT_KEY}`,
|
||||||
|
SCROLL : `scroll${EVENT_KEY}`,
|
||||||
|
LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const ClassName = {
|
||||||
|
DROPDOWN_ITEM : 'dropdown-item',
|
||||||
|
DROPDOWN_MENU : 'dropdown-menu',
|
||||||
|
NAV_LINK : 'nav-link',
|
||||||
|
NAV : 'nav',
|
||||||
|
ACTIVE : 'active'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Selector = {
|
||||||
|
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'
|
||||||
|
}
|
||||||
|
|
||||||
|
const OffsetMethod = {
|
||||||
|
OFFSET : 'offset',
|
||||||
|
POSITION : 'position'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
class ScrollSpy {
|
||||||
|
|
||||||
|
constructor(element, config) {
|
||||||
|
this._element = element
|
||||||
|
this._scrollElement = element.tagName === 'BODY' ? window : element
|
||||||
|
this._config = this._getConfig(config)
|
||||||
|
this._selector = `${this._config.target} ${Selector.NAV_LINKS},`
|
||||||
|
+ `${this._config.target} ${Selector.DROPDOWN_ITEMS}`
|
||||||
|
this._offsets = []
|
||||||
|
this._targets = []
|
||||||
|
this._activeTarget = null
|
||||||
|
this._scrollHeight = 0
|
||||||
|
|
||||||
|
$(this._scrollElement).on(Event.SCROLL, $.proxy(this._process, this))
|
||||||
|
|
||||||
|
this.refresh()
|
||||||
|
this._process()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
static get VERSION() {
|
||||||
|
return VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
static get Default() {
|
||||||
|
return Default
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
refresh() {
|
||||||
|
let autoMethod = this._scrollElement !== this._scrollElement.window ?
|
||||||
|
OffsetMethod.POSITION : OffsetMethod.OFFSET
|
||||||
|
|
||||||
|
let offsetMethod = this._config.method === 'auto' ?
|
||||||
|
autoMethod : this._config.method
|
||||||
|
|
||||||
|
let offsetBase = offsetMethod === OffsetMethod.POSITION ?
|
||||||
|
this._getScrollTop() : 0
|
||||||
|
|
||||||
|
this._offsets = []
|
||||||
|
this._targets = []
|
||||||
|
|
||||||
|
this._scrollHeight = this._getScrollHeight()
|
||||||
|
|
||||||
|
let targets = $.makeArray($(this._selector))
|
||||||
|
|
||||||
|
targets
|
||||||
|
.map((element) => {
|
||||||
|
let target
|
||||||
|
let targetSelector = Util.getSelectorFromElement(element)
|
||||||
|
|
||||||
|
if (targetSelector) {
|
||||||
|
target = $(targetSelector)[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target && (target.offsetWidth || target.offsetHeight)) {
|
||||||
|
// todo (fat): remove sketch reliance on jQuery position/offset
|
||||||
|
return [
|
||||||
|
$(target)[offsetMethod]().top + offsetBase,
|
||||||
|
targetSelector
|
||||||
|
]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.filter((item) => item)
|
||||||
|
.sort((a, b) => a[0] - b[0])
|
||||||
|
.forEach((item) => {
|
||||||
|
this._offsets.push(item[0])
|
||||||
|
this._targets.push(item[1])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
$.removeData(this._element, DATA_KEY)
|
||||||
|
$(this._scrollElement).off(EVENT_KEY)
|
||||||
|
|
||||||
|
this._element = null
|
||||||
|
this._scrollElement = null
|
||||||
|
this._config = null
|
||||||
|
this._selector = null
|
||||||
|
this._offsets = null
|
||||||
|
this._targets = null
|
||||||
|
this._activeTarget = null
|
||||||
|
this._scrollHeight = null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
_getConfig(config) {
|
||||||
|
config = $.extend({}, Default, config)
|
||||||
|
|
||||||
|
if (typeof config.target !== 'string') {
|
||||||
|
let id = $(config.target).attr('id')
|
||||||
|
if (!id) {
|
||||||
|
id = Util.getUID(NAME)
|
||||||
|
$(config.target).attr('id', id)
|
||||||
|
}
|
||||||
|
config.target = `#${id}`
|
||||||
|
}
|
||||||
|
|
||||||
|
Util.typeCheckConfig(NAME, config, DefaultType)
|
||||||
|
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
_getScrollTop() {
|
||||||
|
return this._scrollElement === window ?
|
||||||
|
this._scrollElement.scrollY : this._scrollElement.scrollTop
|
||||||
|
}
|
||||||
|
|
||||||
|
_getScrollHeight() {
|
||||||
|
return this._scrollElement.scrollHeight || Math.max(
|
||||||
|
document.body.scrollHeight,
|
||||||
|
document.documentElement.scrollHeight
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
_process() {
|
||||||
|
let scrollTop = this._getScrollTop() + this._config.offset
|
||||||
|
let scrollHeight = this._getScrollHeight()
|
||||||
|
let maxScroll = this._config.offset
|
||||||
|
+ scrollHeight
|
||||||
|
- this._scrollElement.offsetHeight
|
||||||
|
|
||||||
|
if (this._scrollHeight !== scrollHeight) {
|
||||||
|
this.refresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scrollTop >= maxScroll) {
|
||||||
|
let target = this._targets[this._targets.length - 1]
|
||||||
|
|
||||||
|
if (this._activeTarget !== target) {
|
||||||
|
this._activate(target)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._activeTarget && scrollTop < this._offsets[0]) {
|
||||||
|
this._activeTarget = null
|
||||||
|
this._clear()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = this._offsets.length; i--;) {
|
||||||
|
let isActiveTarget = this._activeTarget !== this._targets[i]
|
||||||
|
&& scrollTop >= this._offsets[i]
|
||||||
|
&& (this._offsets[i + 1] === undefined ||
|
||||||
|
scrollTop < this._offsets[i + 1])
|
||||||
|
|
||||||
|
if (isActiveTarget) {
|
||||||
|
this._activate(this._targets[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_activate(target) {
|
||||||
|
this._activeTarget = target
|
||||||
|
|
||||||
|
this._clear()
|
||||||
|
|
||||||
|
let queries = this._selector.split(',')
|
||||||
|
queries = queries.map((selector) => {
|
||||||
|
return `${selector}[data-target="${target}"],` +
|
||||||
|
`${selector}[href="${target}"]`
|
||||||
|
})
|
||||||
|
|
||||||
|
let $link = $(queries.join(','))
|
||||||
|
|
||||||
|
if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
|
||||||
|
$link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)
|
||||||
|
$link.addClass(ClassName.ACTIVE)
|
||||||
|
} 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)
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._scrollElement).trigger(Event.ACTIVATE, {
|
||||||
|
relatedTarget: target
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
_clear() {
|
||||||
|
$(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
static _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
let data = $(this).data(DATA_KEY)
|
||||||
|
let _config = typeof config === 'object' && config || null
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new ScrollSpy(this, _config)
|
||||||
|
$(this).data(DATA_KEY, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error(`No method named "${config}"`)
|
||||||
|
}
|
||||||
|
data[config]()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$(window).on(Event.LOAD_DATA_API, () => {
|
||||||
|
let scrollSpys = $.makeArray($(Selector.DATA_SPY))
|
||||||
|
|
||||||
|
for (let i = scrollSpys.length; i--;) {
|
||||||
|
let $spy = $(scrollSpys[i])
|
||||||
|
ScrollSpy._jQueryInterface.call($spy, $spy.data())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = ScrollSpy._jQueryInterface
|
||||||
|
$.fn[NAME].Constructor = ScrollSpy
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT
|
||||||
|
return ScrollSpy._jQueryInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
return ScrollSpy
|
||||||
|
|
||||||
|
})(jQuery)
|
||||||
|
|
||||||
|
export default ScrollSpy
|
|
@ -0,0 +1,278 @@
|
||||||
|
import Util from './util'
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): tab.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Tab = (($) => {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'tab'
|
||||||
|
const VERSION = '4.0.0-alpha'
|
||||||
|
const DATA_KEY = 'bs.tab'
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`
|
||||||
|
const DATA_API_KEY = '.data-api'
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
||||||
|
const TRANSITION_DURATION = 150
|
||||||
|
|
||||||
|
const Event = {
|
||||||
|
HIDE : `hide${EVENT_KEY}`,
|
||||||
|
HIDDEN : `hidden${EVENT_KEY}`,
|
||||||
|
SHOW : `show${EVENT_KEY}`,
|
||||||
|
SHOWN : `shown${EVENT_KEY}`,
|
||||||
|
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const ClassName = {
|
||||||
|
DROPDOWN_MENU : 'dropdown-menu',
|
||||||
|
ACTIVE : 'active',
|
||||||
|
FADE : 'fade',
|
||||||
|
IN : 'in'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Selector = {
|
||||||
|
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'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Tab {
|
||||||
|
|
||||||
|
constructor(element) {
|
||||||
|
this._element = element
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
static get VERSION() {
|
||||||
|
return VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
show() {
|
||||||
|
if (this._element.parentNode &&
|
||||||
|
(this._element.parentNode.nodeType === Node.ELEMENT_NODE) &&
|
||||||
|
($(this._element).hasClass(ClassName.ACTIVE))) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let target
|
||||||
|
let previous
|
||||||
|
let ulElement = $(this._element).closest(Selector.UL)[0]
|
||||||
|
let selector = Util.getSelectorFromElement(this._element)
|
||||||
|
|
||||||
|
if (ulElement) {
|
||||||
|
previous = $.makeArray($(ulElement).find(Selector.ACTIVE))
|
||||||
|
previous = previous[previous.length - 1]
|
||||||
|
}
|
||||||
|
|
||||||
|
let hideEvent = $.Event(Event.HIDE, {
|
||||||
|
relatedTarget: this._element
|
||||||
|
})
|
||||||
|
|
||||||
|
let showEvent = $.Event(Event.SHOW, {
|
||||||
|
relatedTarget: previous
|
||||||
|
})
|
||||||
|
|
||||||
|
if (previous) {
|
||||||
|
$(previous).trigger(hideEvent)
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._element).trigger(showEvent)
|
||||||
|
|
||||||
|
if (showEvent.isDefaultPrevented() ||
|
||||||
|
(hideEvent.isDefaultPrevented())) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selector) {
|
||||||
|
target = $(selector)[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
this._activate(
|
||||||
|
this._element,
|
||||||
|
ulElement
|
||||||
|
)
|
||||||
|
|
||||||
|
let complete = () => {
|
||||||
|
let hiddenEvent = $.Event(Event.HIDDEN, {
|
||||||
|
relatedTarget: this._element
|
||||||
|
})
|
||||||
|
|
||||||
|
let shownEvent = $.Event(Event.SHOWN, {
|
||||||
|
relatedTarget: previous
|
||||||
|
})
|
||||||
|
|
||||||
|
$(previous).trigger(hiddenEvent)
|
||||||
|
$(this._element).trigger(shownEvent)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target) {
|
||||||
|
this._activate(target, target.parentNode, complete)
|
||||||
|
} else {
|
||||||
|
complete()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
$.removeClass(this._element, DATA_KEY)
|
||||||
|
this._element = null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
_activate(element, container, callback) {
|
||||||
|
let active = $(container).find(Selector.ACTIVE_CHILD)[0]
|
||||||
|
let isTransitioning = callback
|
||||||
|
&& Util.supportsTransitionEnd()
|
||||||
|
&& ((active && $(active).hasClass(ClassName.FADE))
|
||||||
|
|| Boolean($(container).find(Selector.FADE_CHILD)[0]))
|
||||||
|
|
||||||
|
let complete = $.proxy(
|
||||||
|
this._transitionComplete,
|
||||||
|
this,
|
||||||
|
element,
|
||||||
|
active,
|
||||||
|
isTransitioning,
|
||||||
|
callback
|
||||||
|
)
|
||||||
|
|
||||||
|
if (active && isTransitioning) {
|
||||||
|
$(active)
|
||||||
|
.one(Util.TRANSITION_END, complete)
|
||||||
|
.emulateTransitionEnd(TRANSITION_DURATION)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
complete()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (active) {
|
||||||
|
$(active).removeClass(ClassName.IN)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_transitionComplete(element, active, isTransitioning, callback) {
|
||||||
|
if (active) {
|
||||||
|
$(active).removeClass(ClassName.ACTIVE)
|
||||||
|
|
||||||
|
let dropdownChild = $(active).find(
|
||||||
|
Selector.DROPDOWN_ACTIVE_CHILD
|
||||||
|
)[0]
|
||||||
|
|
||||||
|
if (dropdownChild) {
|
||||||
|
$(dropdownChild).removeClass(ClassName.ACTIVE)
|
||||||
|
}
|
||||||
|
|
||||||
|
active.setAttribute('aria-expanded', false)
|
||||||
|
}
|
||||||
|
|
||||||
|
$(element).addClass(ClassName.ACTIVE)
|
||||||
|
element.setAttribute('aria-expanded', true)
|
||||||
|
|
||||||
|
if (isTransitioning) {
|
||||||
|
Util.reflow(element)
|
||||||
|
$(element).addClass(ClassName.IN)
|
||||||
|
} else {
|
||||||
|
$(element).removeClass(ClassName.FADE)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element.parentNode &&
|
||||||
|
($(element.parentNode).hasClass(ClassName.DROPDOWN_MENU))) {
|
||||||
|
|
||||||
|
let dropdownElement = $(element).closest(Selector.DROPDOWN)[0]
|
||||||
|
if (dropdownElement) {
|
||||||
|
$(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)
|
||||||
|
}
|
||||||
|
|
||||||
|
element.setAttribute('aria-expanded', true)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (callback) {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
static _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
let $this = $(this)
|
||||||
|
let data = $this.data(DATA_KEY)
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = data = new Tab(this)
|
||||||
|
$this.data(DATA_KEY, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error(`No method named "${config}"`)
|
||||||
|
}
|
||||||
|
data[config]()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$(document)
|
||||||
|
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
||||||
|
event.preventDefault()
|
||||||
|
Tab._jQueryInterface.call($(this), 'show')
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Tab._jQueryInterface
|
||||||
|
$.fn[NAME].Constructor = Tab
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT
|
||||||
|
return Tab._jQueryInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
return Tab
|
||||||
|
|
||||||
|
})(jQuery)
|
||||||
|
|
||||||
|
export default Tab
|
|
@ -0,0 +1,652 @@
|
||||||
|
/* global Tether */
|
||||||
|
|
||||||
|
import Util from './util'
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): tooltip.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Tooltip = (($) => {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check for Tether dependency
|
||||||
|
* Tether - http://github.hubspot.com/tether/
|
||||||
|
*/
|
||||||
|
if (window.Tether === undefined) {
|
||||||
|
throw new Error('Bootstrap tooltips require Tether (http://github.hubspot.com/tether/)')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'tooltip'
|
||||||
|
const VERSION = '4.0.0-alpha'
|
||||||
|
const DATA_KEY = 'bs.tooltip'
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
||||||
|
const TRANSITION_DURATION = 150
|
||||||
|
const CLASS_PREFIX = 'bs-tether'
|
||||||
|
|
||||||
|
const Default = {
|
||||||
|
animation : true,
|
||||||
|
template : '<div class="tooltip" role="tooltip">'
|
||||||
|
+ '<div class="tooltip-arrow"></div>'
|
||||||
|
+ '<div class="tooltip-inner"></div></div>',
|
||||||
|
trigger : 'hover focus',
|
||||||
|
title : '',
|
||||||
|
delay : 0,
|
||||||
|
html : false,
|
||||||
|
selector : false,
|
||||||
|
placement : 'top',
|
||||||
|
offset : '0 0',
|
||||||
|
constraints : []
|
||||||
|
}
|
||||||
|
|
||||||
|
const DefaultType = {
|
||||||
|
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'
|
||||||
|
}
|
||||||
|
|
||||||
|
const AttachmentMap = {
|
||||||
|
TOP : 'bottom center',
|
||||||
|
RIGHT : 'middle left',
|
||||||
|
BOTTOM : 'top center',
|
||||||
|
LEFT : 'middle right'
|
||||||
|
}
|
||||||
|
|
||||||
|
const HoverState = {
|
||||||
|
IN : 'in',
|
||||||
|
OUT : 'out'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Event = {
|
||||||
|
HIDE : `hide${EVENT_KEY}`,
|
||||||
|
HIDDEN : `hidden${EVENT_KEY}`,
|
||||||
|
SHOW : `show${EVENT_KEY}`,
|
||||||
|
SHOWN : `shown${EVENT_KEY}`,
|
||||||
|
INSERTED : `inserted${EVENT_KEY}`,
|
||||||
|
CLICK : `click${EVENT_KEY}`,
|
||||||
|
FOCUSIN : `focusin${EVENT_KEY}`,
|
||||||
|
FOCUSOUT : `focusout${EVENT_KEY}`,
|
||||||
|
MOUSEENTER : `mouseenter${EVENT_KEY}`,
|
||||||
|
MOUSELEAVE : `mouseleave${EVENT_KEY}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const ClassName = {
|
||||||
|
FADE : 'fade',
|
||||||
|
IN : 'in'
|
||||||
|
}
|
||||||
|
|
||||||
|
const Selector = {
|
||||||
|
TOOLTIP : '.tooltip',
|
||||||
|
TOOLTIP_INNER : '.tooltip-inner'
|
||||||
|
}
|
||||||
|
|
||||||
|
const TetherClass = {
|
||||||
|
element : false,
|
||||||
|
enabled : false
|
||||||
|
}
|
||||||
|
|
||||||
|
const Trigger = {
|
||||||
|
HOVER : 'hover',
|
||||||
|
FOCUS : 'focus',
|
||||||
|
CLICK : 'click',
|
||||||
|
MANUAL : 'manual'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Tooltip {
|
||||||
|
|
||||||
|
constructor(element, config) {
|
||||||
|
|
||||||
|
// private
|
||||||
|
this._isEnabled = true
|
||||||
|
this._timeout = 0
|
||||||
|
this._hoverState = ''
|
||||||
|
this._activeTrigger = {}
|
||||||
|
this._tether = null
|
||||||
|
|
||||||
|
// protected
|
||||||
|
this.element = element
|
||||||
|
this.config = this._getConfig(config)
|
||||||
|
this.tip = null
|
||||||
|
|
||||||
|
this._setListeners()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// getters
|
||||||
|
|
||||||
|
static get VERSION() {
|
||||||
|
return VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
static get Default() {
|
||||||
|
return Default
|
||||||
|
}
|
||||||
|
|
||||||
|
static get NAME() {
|
||||||
|
return NAME
|
||||||
|
}
|
||||||
|
|
||||||
|
static get DATA_KEY() {
|
||||||
|
return DATA_KEY
|
||||||
|
}
|
||||||
|
|
||||||
|
static get Event() {
|
||||||
|
return Event
|
||||||
|
}
|
||||||
|
|
||||||
|
static get EVENT_KEY() {
|
||||||
|
return EVENT_KEY
|
||||||
|
}
|
||||||
|
|
||||||
|
static get DefaultType() {
|
||||||
|
return DefaultType
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public
|
||||||
|
|
||||||
|
enable() {
|
||||||
|
this._isEnabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
disable() {
|
||||||
|
this._isEnabled = false
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleEnabled() {
|
||||||
|
this._isEnabled = !this._isEnabled
|
||||||
|
}
|
||||||
|
|
||||||
|
toggle(event) {
|
||||||
|
if (event) {
|
||||||
|
let dataKey = this.constructor.DATA_KEY
|
||||||
|
let context = $(event.currentTarget).data(dataKey)
|
||||||
|
|
||||||
|
if (!context) {
|
||||||
|
context = new this.constructor(
|
||||||
|
event.currentTarget,
|
||||||
|
this._getDelegateConfig()
|
||||||
|
)
|
||||||
|
$(event.currentTarget).data(dataKey, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
context._activeTrigger.click = !context._activeTrigger.click
|
||||||
|
|
||||||
|
if (context._isWithActiveTrigger()) {
|
||||||
|
context._enter(null, context)
|
||||||
|
} else {
|
||||||
|
context._leave(null, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if ($(this.getTipElement()).hasClass(ClassName.IN)) {
|
||||||
|
this._leave(null, this)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this._enter(null, this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
clearTimeout(this._timeout)
|
||||||
|
|
||||||
|
this.cleanupTether()
|
||||||
|
|
||||||
|
$.removeData(this.element, this.constructor.DATA_KEY)
|
||||||
|
|
||||||
|
$(this.element).off(this.constructor.EVENT_KEY)
|
||||||
|
|
||||||
|
if (this.tip) {
|
||||||
|
$(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
|
||||||
|
}
|
||||||
|
|
||||||
|
show() {
|
||||||
|
let showEvent = $.Event(this.constructor.Event.SHOW)
|
||||||
|
|
||||||
|
if (this.isWithContent() && this._isEnabled) {
|
||||||
|
$(this.element).trigger(showEvent)
|
||||||
|
|
||||||
|
let isInTheDom = $.contains(
|
||||||
|
this.element.ownerDocument.documentElement,
|
||||||
|
this.element
|
||||||
|
)
|
||||||
|
|
||||||
|
if (showEvent.isDefaultPrevented() || !isInTheDom) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let tip = this.getTipElement()
|
||||||
|
let tipId = Util.getUID(this.constructor.NAME)
|
||||||
|
|
||||||
|
tip.setAttribute('id', tipId)
|
||||||
|
this.element.setAttribute('aria-describedby', tipId)
|
||||||
|
|
||||||
|
this.setContent()
|
||||||
|
|
||||||
|
if (this.config.animation) {
|
||||||
|
$(tip).addClass(ClassName.FADE)
|
||||||
|
}
|
||||||
|
|
||||||
|
let placement = typeof this.config.placement === 'function' ?
|
||||||
|
this.config.placement.call(this, tip, this.element) :
|
||||||
|
this.config.placement
|
||||||
|
|
||||||
|
let attachment = this._getAttachment(placement)
|
||||||
|
|
||||||
|
$(tip)
|
||||||
|
.data(this.constructor.DATA_KEY, this)
|
||||||
|
.appendTo(document.body)
|
||||||
|
|
||||||
|
$(this.element).trigger(this.constructor.Event.INSERTED)
|
||||||
|
|
||||||
|
this._tether = new Tether({
|
||||||
|
attachment,
|
||||||
|
element : tip,
|
||||||
|
target : this.element,
|
||||||
|
classes : TetherClass,
|
||||||
|
classPrefix : CLASS_PREFIX,
|
||||||
|
offset : this.config.offset,
|
||||||
|
constraints : this.config.constraints,
|
||||||
|
addTargetClasses: false
|
||||||
|
})
|
||||||
|
|
||||||
|
Util.reflow(tip)
|
||||||
|
this._tether.position()
|
||||||
|
|
||||||
|
$(tip).addClass(ClassName.IN)
|
||||||
|
|
||||||
|
let complete = () => {
|
||||||
|
let prevHoverState = this._hoverState
|
||||||
|
this._hoverState = null
|
||||||
|
|
||||||
|
$(this.element).trigger(this.constructor.Event.SHOWN)
|
||||||
|
|
||||||
|
if (prevHoverState === HoverState.OUT) {
|
||||||
|
this._leave(null, this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
|
||||||
|
$(this.tip)
|
||||||
|
.one(Util.TRANSITION_END, complete)
|
||||||
|
.emulateTransitionEnd(Tooltip._TRANSITION_DURATION)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
complete()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hide(callback) {
|
||||||
|
let tip = this.getTipElement()
|
||||||
|
let hideEvent = $.Event(this.constructor.Event.HIDE)
|
||||||
|
let complete = () => {
|
||||||
|
if (this._hoverState !== HoverState.IN && tip.parentNode) {
|
||||||
|
tip.parentNode.removeChild(tip)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.element.removeAttribute('aria-describedby')
|
||||||
|
$(this.element).trigger(this.constructor.Event.HIDDEN)
|
||||||
|
this.cleanupTether()
|
||||||
|
|
||||||
|
if (callback) {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this.element).trigger(hideEvent)
|
||||||
|
|
||||||
|
if (hideEvent.isDefaultPrevented()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
$(tip).removeClass(ClassName.IN)
|
||||||
|
|
||||||
|
if (Util.supportsTransitionEnd() &&
|
||||||
|
($(this.tip).hasClass(ClassName.FADE))) {
|
||||||
|
|
||||||
|
$(tip)
|
||||||
|
.one(Util.TRANSITION_END, complete)
|
||||||
|
.emulateTransitionEnd(TRANSITION_DURATION)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
complete()
|
||||||
|
}
|
||||||
|
|
||||||
|
this._hoverState = ''
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// protected
|
||||||
|
|
||||||
|
isWithContent() {
|
||||||
|
return Boolean(this.getTitle())
|
||||||
|
}
|
||||||
|
|
||||||
|
getTipElement() {
|
||||||
|
return (this.tip = this.tip || $(this.config.template)[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
setContent() {
|
||||||
|
let $tip = $(this.getTipElement())
|
||||||
|
|
||||||
|
this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle())
|
||||||
|
|
||||||
|
$tip
|
||||||
|
.removeClass(ClassName.FADE)
|
||||||
|
.removeClass(ClassName.IN)
|
||||||
|
|
||||||
|
this.cleanupTether()
|
||||||
|
}
|
||||||
|
|
||||||
|
setElementContent($element, content) {
|
||||||
|
let html = this.config.html
|
||||||
|
if (typeof content === 'object' && (content.nodeType || content.jquery)) {
|
||||||
|
// content is a DOM node or a jQuery
|
||||||
|
if (html) {
|
||||||
|
if (!$(content).parent().is($element)) {
|
||||||
|
$element.empty().append(content)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$element.text($(content).text())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$element[html ? 'html' : 'text'](content)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getTitle() {
|
||||||
|
let title = this.element.getAttribute('data-original-title')
|
||||||
|
|
||||||
|
if (!title) {
|
||||||
|
title = typeof this.config.title === 'function' ?
|
||||||
|
this.config.title.call(this.element) :
|
||||||
|
this.config.title
|
||||||
|
}
|
||||||
|
|
||||||
|
return title
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanupTether() {
|
||||||
|
if (this._tether) {
|
||||||
|
this._tether.destroy()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// private
|
||||||
|
|
||||||
|
_getAttachment(placement) {
|
||||||
|
return AttachmentMap[placement.toUpperCase()]
|
||||||
|
}
|
||||||
|
|
||||||
|
_setListeners() {
|
||||||
|
let triggers = this.config.trigger.split(' ')
|
||||||
|
|
||||||
|
triggers.forEach((trigger) => {
|
||||||
|
if (trigger === 'click') {
|
||||||
|
$(this.element).on(
|
||||||
|
this.constructor.Event.CLICK,
|
||||||
|
this.config.selector,
|
||||||
|
$.proxy(this.toggle, this)
|
||||||
|
)
|
||||||
|
|
||||||
|
} else if (trigger !== Trigger.MANUAL) {
|
||||||
|
let eventIn = trigger === Trigger.HOVER ?
|
||||||
|
this.constructor.Event.MOUSEENTER :
|
||||||
|
this.constructor.Event.FOCUSIN
|
||||||
|
let eventOut = trigger === Trigger.HOVER ?
|
||||||
|
this.constructor.Event.MOUSELEAVE :
|
||||||
|
this.constructor.Event.FOCUSOUT
|
||||||
|
|
||||||
|
$(this.element)
|
||||||
|
.on(
|
||||||
|
eventIn,
|
||||||
|
this.config.selector,
|
||||||
|
$.proxy(this._enter, this)
|
||||||
|
)
|
||||||
|
.on(
|
||||||
|
eventOut,
|
||||||
|
this.config.selector,
|
||||||
|
$.proxy(this._leave, this)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (this.config.selector) {
|
||||||
|
this.config = $.extend({}, this.config, {
|
||||||
|
trigger : 'manual',
|
||||||
|
selector : ''
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this._fixTitle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_fixTitle() {
|
||||||
|
let titleType = typeof this.element.getAttribute('data-original-title')
|
||||||
|
if (this.element.getAttribute('title') ||
|
||||||
|
(titleType !== 'string')) {
|
||||||
|
this.element.setAttribute(
|
||||||
|
'data-original-title',
|
||||||
|
this.element.getAttribute('title') || ''
|
||||||
|
)
|
||||||
|
this.element.setAttribute('title', '')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_enter(event, context) {
|
||||||
|
let dataKey = this.constructor.DATA_KEY
|
||||||
|
|
||||||
|
context = context || $(event.currentTarget).data(dataKey)
|
||||||
|
|
||||||
|
if (!context) {
|
||||||
|
context = new this.constructor(
|
||||||
|
event.currentTarget,
|
||||||
|
this._getDelegateConfig()
|
||||||
|
)
|
||||||
|
$(event.currentTarget).data(dataKey, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event) {
|
||||||
|
context._activeTrigger[
|
||||||
|
event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER
|
||||||
|
] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($(context.getTipElement()).hasClass(ClassName.IN) ||
|
||||||
|
(context._hoverState === HoverState.IN)) {
|
||||||
|
context._hoverState = HoverState.IN
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
clearTimeout(context._timeout)
|
||||||
|
|
||||||
|
context._hoverState = HoverState.IN
|
||||||
|
|
||||||
|
if (!context.config.delay || !context.config.delay.show) {
|
||||||
|
context.show()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
context._timeout = setTimeout(() => {
|
||||||
|
if (context._hoverState === HoverState.IN) {
|
||||||
|
context.show()
|
||||||
|
}
|
||||||
|
}, context.config.delay.show)
|
||||||
|
}
|
||||||
|
|
||||||
|
_leave(event, context) {
|
||||||
|
let dataKey = this.constructor.DATA_KEY
|
||||||
|
|
||||||
|
context = context || $(event.currentTarget).data(dataKey)
|
||||||
|
|
||||||
|
if (!context) {
|
||||||
|
context = new this.constructor(
|
||||||
|
event.currentTarget,
|
||||||
|
this._getDelegateConfig()
|
||||||
|
)
|
||||||
|
$(event.currentTarget).data(dataKey, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event) {
|
||||||
|
context._activeTrigger[
|
||||||
|
event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER
|
||||||
|
] = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (context._isWithActiveTrigger()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
clearTimeout(context._timeout)
|
||||||
|
|
||||||
|
context._hoverState = HoverState.OUT
|
||||||
|
|
||||||
|
if (!context.config.delay || !context.config.delay.hide) {
|
||||||
|
context.hide()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
context._timeout = setTimeout(() => {
|
||||||
|
if (context._hoverState === HoverState.OUT) {
|
||||||
|
context.hide()
|
||||||
|
}
|
||||||
|
}, context.config.delay.hide)
|
||||||
|
}
|
||||||
|
|
||||||
|
_isWithActiveTrigger() {
|
||||||
|
for (let trigger in this._activeTrigger) {
|
||||||
|
if (this._activeTrigger[trigger]) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
_getConfig(config) {
|
||||||
|
config = $.extend(
|
||||||
|
{},
|
||||||
|
this.constructor.Default,
|
||||||
|
$(this.element).data(),
|
||||||
|
config
|
||||||
|
)
|
||||||
|
|
||||||
|
if (config.delay && typeof config.delay === 'number') {
|
||||||
|
config.delay = {
|
||||||
|
show : config.delay,
|
||||||
|
hide : config.delay
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Util.typeCheckConfig(
|
||||||
|
NAME,
|
||||||
|
config,
|
||||||
|
this.constructor.DefaultType
|
||||||
|
)
|
||||||
|
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
_getDelegateConfig() {
|
||||||
|
let config = {}
|
||||||
|
|
||||||
|
if (this.config) {
|
||||||
|
for (let key in this.config) {
|
||||||
|
if (this.constructor.Default[key] !== this.config[key]) {
|
||||||
|
config[key] = this.config[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static
|
||||||
|
|
||||||
|
static _jQueryInterface(config) {
|
||||||
|
return this.each(function () {
|
||||||
|
let data = $(this).data(DATA_KEY)
|
||||||
|
let _config = typeof config === 'object' ?
|
||||||
|
config : null
|
||||||
|
|
||||||
|
if (!data && /destroy|hide/.test(config)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
data = new Tooltip(this, _config)
|
||||||
|
$(this).data(DATA_KEY, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (data[config] === undefined) {
|
||||||
|
throw new Error(`No method named "${config}"`)
|
||||||
|
}
|
||||||
|
data[config]()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$.fn[NAME] = Tooltip._jQueryInterface
|
||||||
|
$.fn[NAME].Constructor = Tooltip
|
||||||
|
$.fn[NAME].noConflict = function () {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT
|
||||||
|
return Tooltip._jQueryInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
return Tooltip
|
||||||
|
|
||||||
|
})(jQuery)
|
||||||
|
|
||||||
|
export default Tooltip
|
|
@ -0,0 +1,160 @@
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Bootstrap (v4.0.0-alpha.2): util.js
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Util = (($) => {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Private TransitionEnd Helpers
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
let transition = false
|
||||||
|
|
||||||
|
const TransitionEndEvent = {
|
||||||
|
WebkitTransition : 'webkitTransitionEnd',
|
||||||
|
MozTransition : 'transitionend',
|
||||||
|
OTransition : 'oTransitionEnd otransitionend',
|
||||||
|
transition : 'transitionend'
|
||||||
|
}
|
||||||
|
|
||||||
|
// shoutout AngusCroll (https://goo.gl/pxwQGp)
|
||||||
|
function toType(obj) {
|
||||||
|
return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
|
||||||
|
}
|
||||||
|
|
||||||
|
function isElement(obj) {
|
||||||
|
return (obj[0] || obj).nodeType
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSpecialTransitionEndEvent() {
|
||||||
|
return {
|
||||||
|
bindType: transition.end,
|
||||||
|
delegateType: transition.end,
|
||||||
|
handle(event) {
|
||||||
|
if ($(event.target).is(this)) {
|
||||||
|
return event.handleObj.handler.apply(this, arguments)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function transitionEndTest() {
|
||||||
|
if (window.QUnit) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
let el = document.createElement('bootstrap')
|
||||||
|
|
||||||
|
for (let name in TransitionEndEvent) {
|
||||||
|
if (el.style[name] !== undefined) {
|
||||||
|
return { end: TransitionEndEvent[name] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
function transitionEndEmulator(duration) {
|
||||||
|
let called = false
|
||||||
|
|
||||||
|
$(this).one(Util.TRANSITION_END, () => {
|
||||||
|
called = true
|
||||||
|
})
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
if (!called) {
|
||||||
|
Util.triggerTransitionEnd(this)
|
||||||
|
}
|
||||||
|
}, duration)
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
function setTransitionEndSupport() {
|
||||||
|
transition = transitionEndTest()
|
||||||
|
|
||||||
|
$.fn.emulateTransitionEnd = transitionEndEmulator
|
||||||
|
|
||||||
|
if (Util.supportsTransitionEnd()) {
|
||||||
|
$.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Public Util Api
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
let Util = {
|
||||||
|
|
||||||
|
TRANSITION_END: 'bsTransitionEnd',
|
||||||
|
|
||||||
|
getUID(prefix) {
|
||||||
|
do {
|
||||||
|
prefix += ~~(Math.random() * 1000000) // "~~" acts like a faster Math.floor() here
|
||||||
|
} while (document.getElementById(prefix))
|
||||||
|
return prefix
|
||||||
|
},
|
||||||
|
|
||||||
|
getSelectorFromElement(element) {
|
||||||
|
let selector = element.getAttribute('data-target')
|
||||||
|
|
||||||
|
if (!selector) {
|
||||||
|
selector = element.getAttribute('href') || ''
|
||||||
|
selector = /^#[a-z]/i.test(selector) ? selector : null
|
||||||
|
}
|
||||||
|
|
||||||
|
return selector
|
||||||
|
},
|
||||||
|
|
||||||
|
reflow(element) {
|
||||||
|
new Function('bs', 'return bs')(element.offsetHeight)
|
||||||
|
},
|
||||||
|
|
||||||
|
triggerTransitionEnd(element) {
|
||||||
|
$(element).trigger(transition.end)
|
||||||
|
},
|
||||||
|
|
||||||
|
supportsTransitionEnd() {
|
||||||
|
return Boolean(transition)
|
||||||
|
},
|
||||||
|
|
||||||
|
typeCheckConfig(componentName, config, configTypes) {
|
||||||
|
for (let property in configTypes) {
|
||||||
|
if (configTypes.hasOwnProperty(property)) {
|
||||||
|
let expectedTypes = configTypes[property]
|
||||||
|
let value = config[property]
|
||||||
|
let valueType
|
||||||
|
|
||||||
|
if (value && isElement(value)) {
|
||||||
|
valueType = 'element'
|
||||||
|
} else {
|
||||||
|
valueType = toType(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!new RegExp(expectedTypes).test(valueType)) {
|
||||||
|
throw new Error(
|
||||||
|
`${componentName.toUpperCase()}: ` +
|
||||||
|
`Option "${property}" provided type "${valueType}" ` +
|
||||||
|
`but expected type "${expectedTypes}".`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setTransitionEndSupport()
|
||||||
|
|
||||||
|
return Util
|
||||||
|
|
||||||
|
})(jQuery)
|
||||||
|
|
||||||
|
export default Util
|
|
@ -0,0 +1,9 @@
|
||||||
|
@function twbs-font-path($path) {
|
||||||
|
@return font-url($path, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@function twbs-image-path($path) {
|
||||||
|
@return image-url($path, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
$bootstrap-sass-asset-helper: true;
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Mincer asset helper functions
|
||||||
|
//
|
||||||
|
// This must be imported into a .css.ejs.scss file.
|
||||||
|
// Then, <% %>-interpolations will be parsed as strings by Sass, and evaluated by EJS after Sass compilation.
|
||||||
|
|
||||||
|
|
||||||
|
@function twbs-font-path($path) {
|
||||||
|
// do something like following
|
||||||
|
// from "path/to/font.ext#suffix" to "<%- asset_path(path/to/font.ext)) + #suffix %>"
|
||||||
|
// from "path/to/font.ext?#suffix" to "<%- asset_path(path/to/font.ext)) + ?#suffix %>"
|
||||||
|
// or from "path/to/font.ext" just "<%- asset_path(path/to/font.ext)) %>"
|
||||||
|
@return "<%- asset_path("#{$path}".replace(/[#?].*$/, '')) + "#{$path}".replace(/(^[^#?]*)([#?]?.*$)/, '$2') %>";
|
||||||
|
}
|
||||||
|
|
||||||
|
@function twbs-image-path($file) {
|
||||||
|
@return "<%- asset_path("#{$file}") %>";
|
||||||
|
}
|
||||||
|
|
||||||
|
$bootstrap-sass-asset-helper: true;
|
|
@ -0,0 +1,9 @@
|
||||||
|
@function twbs-font-path($path) {
|
||||||
|
@return font-path($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@function twbs-image-path($path) {
|
||||||
|
@return image-path($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
$bootstrap-sass-asset-helper: true;
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*!
|
||||||
|
* Bootstrap v3.3.6 (http://getbootstrap.com)
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Core variables and mixins
|
||||||
|
@import "bootstrap/variables";
|
||||||
|
@import "bootstrap/mixins";
|
||||||
|
|
||||||
|
// Reset and dependencies
|
||||||
|
@import "bootstrap/normalize";
|
||||||
|
@import "bootstrap/print";
|
||||||
|
@import "bootstrap/glyphicons";
|
||||||
|
|
||||||
|
// Core CSS
|
||||||
|
@import "bootstrap/scaffolding";
|
||||||
|
@import "bootstrap/type";
|
||||||
|
@import "bootstrap/code";
|
||||||
|
@import "bootstrap/grid";
|
||||||
|
@import "bootstrap/tables";
|
||||||
|
@import "bootstrap/forms";
|
||||||
|
@import "bootstrap/buttons";
|
||||||
|
|
||||||
|
// Components
|
||||||
|
@import "bootstrap/component-animations";
|
||||||
|
@import "bootstrap/dropdowns";
|
||||||
|
@import "bootstrap/button-groups";
|
||||||
|
@import "bootstrap/input-groups";
|
||||||
|
@import "bootstrap/navs";
|
||||||
|
@import "bootstrap/navbar";
|
||||||
|
@import "bootstrap/breadcrumbs";
|
||||||
|
@import "bootstrap/pagination";
|
||||||
|
@import "bootstrap/pager";
|
||||||
|
@import "bootstrap/labels";
|
||||||
|
@import "bootstrap/badges";
|
||||||
|
@import "bootstrap/jumbotron";
|
||||||
|
@import "bootstrap/thumbnails";
|
||||||
|
@import "bootstrap/alerts";
|
||||||
|
@import "bootstrap/progress-bars";
|
||||||
|
@import "bootstrap/media";
|
||||||
|
@import "bootstrap/list-group";
|
||||||
|
@import "bootstrap/panels";
|
||||||
|
@import "bootstrap/responsive-embed";
|
||||||
|
@import "bootstrap/wells";
|
||||||
|
@import "bootstrap/close";
|
||||||
|
|
||||||
|
// Components w/ JavaScript
|
||||||
|
@import "bootstrap/modals";
|
||||||
|
@import "bootstrap/tooltip";
|
||||||
|
@import "bootstrap/popovers";
|
||||||
|
@import "bootstrap/carousel";
|
||||||
|
|
||||||
|
// Utility classes
|
||||||
|
@import "bootstrap/utilities";
|
||||||
|
@import "bootstrap/responsive-utilities";
|
|
@ -0,0 +1,73 @@
|
||||||
|
//
|
||||||
|
// Alerts
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Base styles
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.alert {
|
||||||
|
padding: $alert-padding;
|
||||||
|
margin-bottom: $line-height-computed;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: $alert-border-radius;
|
||||||
|
|
||||||
|
// Headings for larger alerts
|
||||||
|
h4 {
|
||||||
|
margin-top: 0;
|
||||||
|
// Specified for the h4 to prevent conflicts of changing $headings-color
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Provide class for links that match alerts
|
||||||
|
.alert-link {
|
||||||
|
font-weight: $alert-link-font-weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Improve alignment and spacing of inner content
|
||||||
|
> p,
|
||||||
|
> ul {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
> p + p {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dismissible alerts
|
||||||
|
//
|
||||||
|
// Expand the right padding and account for the close button's positioning.
|
||||||
|
|
||||||
|
.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.
|
||||||
|
.alert-dismissible {
|
||||||
|
padding-right: ($alert-padding + 20);
|
||||||
|
|
||||||
|
// Adjust close link position
|
||||||
|
.close {
|
||||||
|
position: relative;
|
||||||
|
top: -2px;
|
||||||
|
right: -21px;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Alternate styles
|
||||||
|
//
|
||||||
|
// Generate contextual modifier classes for colorizing the alert.
|
||||||
|
|
||||||
|
.alert-success {
|
||||||
|
@include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-info {
|
||||||
|
@include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-warning {
|
||||||
|
@include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-danger {
|
||||||
|
@include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
//
|
||||||
|
// Badges
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Base class
|
||||||
|
.badge {
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 10px;
|
||||||
|
padding: 3px 7px;
|
||||||
|
font-size: $font-size-small;
|
||||||
|
font-weight: $badge-font-weight;
|
||||||
|
color: $badge-color;
|
||||||
|
line-height: $badge-line-height;
|
||||||
|
vertical-align: middle;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-align: center;
|
||||||
|
background-color: $badge-bg;
|
||||||
|
border-radius: $badge-border-radius;
|
||||||
|
|
||||||
|
// Empty badges collapse automatically (not available in IE8)
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Quick fix for badges in buttons
|
||||||
|
.btn & {
|
||||||
|
position: relative;
|
||||||
|
top: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-xs &,
|
||||||
|
.btn-group-xs > .btn & {
|
||||||
|
top: 0;
|
||||||
|
padding: 1px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// [converter] extracted a& to a.badge
|
||||||
|
|
||||||
|
// Account for badges in navs
|
||||||
|
.list-group-item.active > &,
|
||||||
|
.nav-pills > .active > a > & {
|
||||||
|
color: $badge-active-color;
|
||||||
|
background-color: $badge-active-bg;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-group-item > & {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-group-item > & + & {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-pills > li > a > & {
|
||||||
|
margin-left: 3px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hover state, but only for links
|
||||||
|
a.badge {
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $badge-link-hover-color;
|
||||||
|
text-decoration: none;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
//
|
||||||
|
// Breadcrumbs
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
.breadcrumb {
|
||||||
|
padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;
|
||||||
|
margin-bottom: $line-height-computed;
|
||||||
|
list-style: none;
|
||||||
|
background-color: $breadcrumb-bg;
|
||||||
|
border-radius: $border-radius-base;
|
||||||
|
|
||||||
|
> li {
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
+ li:before {
|
||||||
|
// [converter] Workaround for https://github.com/sass/libsass/issues/1115
|
||||||
|
$nbsp: "\00a0";
|
||||||
|
content: "#{$breadcrumb-separator}#{$nbsp}"; // Unicode space added since inline-block means non-collapsing white-space
|
||||||
|
padding: 0 5px;
|
||||||
|
color: $breadcrumb-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .active {
|
||||||
|
color: $breadcrumb-active-color;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,244 @@
|
||||||
|
//
|
||||||
|
// Button groups
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// Make the div behave like a button
|
||||||
|
.btn-group,
|
||||||
|
.btn-group-vertical {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle; // match .btn alignment given font-size hack above
|
||||||
|
> .btn {
|
||||||
|
position: relative;
|
||||||
|
float: left;
|
||||||
|
// Bring the "active" button to the front
|
||||||
|
&:hover,
|
||||||
|
&:focus,
|
||||||
|
&:active,
|
||||||
|
&.active {
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent double borders when buttons are next to each other
|
||||||
|
.btn-group {
|
||||||
|
.btn + .btn,
|
||||||
|
.btn + .btn-group,
|
||||||
|
.btn-group + .btn,
|
||||||
|
.btn-group + .btn-group {
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional: Group multiple button groups together for a toolbar
|
||||||
|
.btn-toolbar {
|
||||||
|
margin-left: -5px; // Offset the first child's margin
|
||||||
|
@include clearfix;
|
||||||
|
|
||||||
|
.btn,
|
||||||
|
.btn-group,
|
||||||
|
.input-group {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
> .btn,
|
||||||
|
> .btn-group,
|
||||||
|
> .input-group {
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
|
||||||
|
.btn-group > .btn:first-child {
|
||||||
|
margin-left: 0;
|
||||||
|
&:not(:last-child):not(.dropdown-toggle) {
|
||||||
|
@include border-right-radius(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
|
||||||
|
.btn-group > .btn:last-child:not(:first-child),
|
||||||
|
.btn-group > .dropdown-toggle:not(:first-child) {
|
||||||
|
@include border-left-radius(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
|
||||||
|
.btn-group > .btn-group {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
.btn-group > .btn-group:first-child:not(:last-child) {
|
||||||
|
> .btn:last-child,
|
||||||
|
> .dropdown-toggle {
|
||||||
|
@include border-right-radius(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
|
||||||
|
@include border-left-radius(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// On active and open, don't show outline
|
||||||
|
.btn-group .dropdown-toggle:active,
|
||||||
|
.btn-group.open .dropdown-toggle {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Sizing
|
||||||
|
//
|
||||||
|
// Remix the default button sizing classes into new ones for easier manipulation.
|
||||||
|
|
||||||
|
.btn-group-xs > .btn { @extend .btn-xs; }
|
||||||
|
.btn-group-sm > .btn { @extend .btn-sm; }
|
||||||
|
.btn-group-lg > .btn { @extend .btn-lg; }
|
||||||
|
|
||||||
|
|
||||||
|
// Split button dropdowns
|
||||||
|
// ----------------------
|
||||||
|
|
||||||
|
// Give the line between buttons some depth
|
||||||
|
.btn-group > .btn + .dropdown-toggle {
|
||||||
|
padding-left: 8px;
|
||||||
|
padding-right: 8px;
|
||||||
|
}
|
||||||
|
.btn-group > .btn-lg + .dropdown-toggle {
|
||||||
|
padding-left: 12px;
|
||||||
|
padding-right: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The clickable button for toggling the menu
|
||||||
|
// Remove the gradient and set the same inset shadow as the :active state
|
||||||
|
.btn-group.open .dropdown-toggle {
|
||||||
|
@include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
|
||||||
|
|
||||||
|
// Show no shadow for `.btn-link` since it has no other button styles.
|
||||||
|
&.btn-link {
|
||||||
|
@include box-shadow(none);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Reposition the caret
|
||||||
|
.btn .caret {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
// Carets in other button sizes
|
||||||
|
.btn-lg .caret {
|
||||||
|
border-width: $caret-width-large $caret-width-large 0;
|
||||||
|
border-bottom-width: 0;
|
||||||
|
}
|
||||||
|
// Upside down carets for .dropup
|
||||||
|
.dropup .btn-lg .caret {
|
||||||
|
border-width: 0 $caret-width-large $caret-width-large;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Vertical button groups
|
||||||
|
// ----------------------
|
||||||
|
|
||||||
|
.btn-group-vertical {
|
||||||
|
> .btn,
|
||||||
|
> .btn-group,
|
||||||
|
> .btn-group > .btn {
|
||||||
|
display: block;
|
||||||
|
float: none;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear floats so dropdown menus can be properly placed
|
||||||
|
> .btn-group {
|
||||||
|
@include clearfix;
|
||||||
|
> .btn {
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .btn + .btn,
|
||||||
|
> .btn + .btn-group,
|
||||||
|
> .btn-group + .btn,
|
||||||
|
> .btn-group + .btn-group {
|
||||||
|
margin-top: -1px;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-group-vertical > .btn {
|
||||||
|
&:not(:first-child):not(:last-child) {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
&:first-child:not(:last-child) {
|
||||||
|
@include border-top-radius($btn-border-radius-base);
|
||||||
|
@include border-bottom-radius(0);
|
||||||
|
}
|
||||||
|
&:last-child:not(:first-child) {
|
||||||
|
@include border-top-radius(0);
|
||||||
|
@include border-bottom-radius($btn-border-radius-base);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
.btn-group-vertical > .btn-group:first-child:not(:last-child) {
|
||||||
|
> .btn:last-child,
|
||||||
|
> .dropdown-toggle {
|
||||||
|
@include border-bottom-radius(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
|
||||||
|
@include border-top-radius(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Justified button groups
|
||||||
|
// ----------------------
|
||||||
|
|
||||||
|
.btn-group-justified {
|
||||||
|
display: table;
|
||||||
|
width: 100%;
|
||||||
|
table-layout: fixed;
|
||||||
|
border-collapse: separate;
|
||||||
|
> .btn,
|
||||||
|
> .btn-group {
|
||||||
|
float: none;
|
||||||
|
display: table-cell;
|
||||||
|
width: 1%;
|
||||||
|
}
|
||||||
|
> .btn-group .btn {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .btn-group .dropdown-menu {
|
||||||
|
left: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Checkbox and radio options
|
||||||
|
//
|
||||||
|
// In order to support the browser's form validation feedback, powered by the
|
||||||
|
// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
|
||||||
|
// `display: none;` or `visibility: hidden;` as that also hides the popover.
|
||||||
|
// Simply visually hiding the inputs via `opacity` would leave them clickable in
|
||||||
|
// certain cases which is prevented by using `clip` and `pointer-events`.
|
||||||
|
// This way, we ensure a DOM element is visible to position the popover from.
|
||||||
|
//
|
||||||
|
// See https://github.com/twbs/bootstrap/pull/12794 and
|
||||||
|
// https://github.com/twbs/bootstrap/pull/14559 for more information.
|
||||||
|
|
||||||
|
[data-toggle="buttons"] {
|
||||||
|
> .btn,
|
||||||
|
> .btn-group > .btn {
|
||||||
|
input[type="radio"],
|
||||||
|
input[type="checkbox"] {
|
||||||
|
position: absolute;
|
||||||
|
clip: rect(0,0,0,0);
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,168 @@
|
||||||
|
//
|
||||||
|
// Buttons
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Base styles
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 0; // For input.btn
|
||||||
|
font-weight: $btn-font-weight;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
touch-action: manipulation;
|
||||||
|
cursor: pointer;
|
||||||
|
background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
|
||||||
|
border: 1px solid transparent;
|
||||||
|
white-space: nowrap;
|
||||||
|
@include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);
|
||||||
|
@include user-select(none);
|
||||||
|
|
||||||
|
&,
|
||||||
|
&:active,
|
||||||
|
&.active {
|
||||||
|
&:focus,
|
||||||
|
&.focus {
|
||||||
|
@include tab-focus;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus,
|
||||||
|
&.focus {
|
||||||
|
color: $btn-default-color;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active,
|
||||||
|
&.active {
|
||||||
|
outline: 0;
|
||||||
|
background-image: none;
|
||||||
|
@include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled,
|
||||||
|
&[disabled],
|
||||||
|
fieldset[disabled] & {
|
||||||
|
cursor: $cursor-disabled;
|
||||||
|
@include opacity(.65);
|
||||||
|
@include box-shadow(none);
|
||||||
|
}
|
||||||
|
|
||||||
|
// [converter] extracted a& to a.btn
|
||||||
|
}
|
||||||
|
|
||||||
|
a.btn {
|
||||||
|
&.disabled,
|
||||||
|
fieldset[disabled] & {
|
||||||
|
pointer-events: none; // Future-proof disabling of clicks on `<a>` elements
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Alternate buttons
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
.btn-default {
|
||||||
|
@include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);
|
||||||
|
}
|
||||||
|
.btn-primary {
|
||||||
|
@include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);
|
||||||
|
}
|
||||||
|
// Success appears as green
|
||||||
|
.btn-success {
|
||||||
|
@include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);
|
||||||
|
}
|
||||||
|
// Info appears as blue-green
|
||||||
|
.btn-info {
|
||||||
|
@include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);
|
||||||
|
}
|
||||||
|
// Warning appears as orange
|
||||||
|
.btn-warning {
|
||||||
|
@include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);
|
||||||
|
}
|
||||||
|
// Danger and error appear as red
|
||||||
|
.btn-danger {
|
||||||
|
@include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Link buttons
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
// Make a button look and behave like a link
|
||||||
|
.btn-link {
|
||||||
|
color: $link-color;
|
||||||
|
font-weight: normal;
|
||||||
|
border-radius: 0;
|
||||||
|
|
||||||
|
&,
|
||||||
|
&:active,
|
||||||
|
&.active,
|
||||||
|
&[disabled],
|
||||||
|
fieldset[disabled] & {
|
||||||
|
background-color: transparent;
|
||||||
|
@include box-shadow(none);
|
||||||
|
}
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus,
|
||||||
|
&:active {
|
||||||
|
border-color: transparent;
|
||||||
|
}
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $link-hover-color;
|
||||||
|
text-decoration: $link-hover-decoration;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
&[disabled],
|
||||||
|
fieldset[disabled] & {
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $btn-link-disabled-color;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Button Sizes
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
.btn-lg {
|
||||||
|
// line-height: ensure even-numbered height of button next to large input
|
||||||
|
@include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);
|
||||||
|
}
|
||||||
|
.btn-sm {
|
||||||
|
// line-height: ensure proper height of button next to small input
|
||||||
|
@include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);
|
||||||
|
}
|
||||||
|
.btn-xs {
|
||||||
|
@include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Block button
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
.btn-block {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vertically space out multiple block buttons
|
||||||
|
.btn-block + .btn-block {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Specificity overrides
|
||||||
|
input[type="submit"],
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="button"] {
|
||||||
|
&.btn-block {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,270 @@
|
||||||
|
//
|
||||||
|
// Carousel
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Wrapper for the slide container and indicators
|
||||||
|
.carousel {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.carousel-inner {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
> .item {
|
||||||
|
display: none;
|
||||||
|
position: relative;
|
||||||
|
@include transition(.6s ease-in-out left);
|
||||||
|
|
||||||
|
// Account for jankitude on images
|
||||||
|
> img,
|
||||||
|
> a > img {
|
||||||
|
@include img-responsive;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// WebKit CSS3 transforms for supported devices
|
||||||
|
@media all and (transform-3d), (-webkit-transform-3d) {
|
||||||
|
@include transition-transform(0.6s ease-in-out);
|
||||||
|
@include backface-visibility(hidden);
|
||||||
|
@include perspective(1000px);
|
||||||
|
|
||||||
|
&.next,
|
||||||
|
&.active.right {
|
||||||
|
@include translate3d(100%, 0, 0);
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
&.prev,
|
||||||
|
&.active.left {
|
||||||
|
@include translate3d(-100%, 0, 0);
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
&.next.left,
|
||||||
|
&.prev.right,
|
||||||
|
&.active {
|
||||||
|
@include translate3d(0, 0, 0);
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .active,
|
||||||
|
> .next,
|
||||||
|
> .prev {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .active {
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .next,
|
||||||
|
> .prev {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .next {
|
||||||
|
left: 100%;
|
||||||
|
}
|
||||||
|
> .prev {
|
||||||
|
left: -100%;
|
||||||
|
}
|
||||||
|
> .next.left,
|
||||||
|
> .prev.right {
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .active.left {
|
||||||
|
left: -100%;
|
||||||
|
}
|
||||||
|
> .active.right {
|
||||||
|
left: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Left/right controls for nav
|
||||||
|
// ---------------------------
|
||||||
|
|
||||||
|
.carousel-control {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
width: $carousel-control-width;
|
||||||
|
@include opacity($carousel-control-opacity);
|
||||||
|
font-size: $carousel-control-font-size;
|
||||||
|
color: $carousel-control-color;
|
||||||
|
text-align: center;
|
||||||
|
text-shadow: $carousel-text-shadow;
|
||||||
|
background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug
|
||||||
|
// We can't have this 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-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));
|
||||||
|
}
|
||||||
|
&.right {
|
||||||
|
left: auto;
|
||||||
|
right: 0;
|
||||||
|
@include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hover/focus state
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
outline: 0;
|
||||||
|
color: $carousel-control-color;
|
||||||
|
text-decoration: none;
|
||||||
|
@include opacity(.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Toggles
|
||||||
|
.icon-prev,
|
||||||
|
.icon-next,
|
||||||
|
.glyphicon-chevron-left,
|
||||||
|
.glyphicon-chevron-right {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
margin-top: -10px;
|
||||||
|
z-index: 5;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.icon-prev,
|
||||||
|
.glyphicon-chevron-left {
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -10px;
|
||||||
|
}
|
||||||
|
.icon-next,
|
||||||
|
.glyphicon-chevron-right {
|
||||||
|
right: 50%;
|
||||||
|
margin-right: -10px;
|
||||||
|
}
|
||||||
|
.icon-prev,
|
||||||
|
.icon-next {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
line-height: 1;
|
||||||
|
font-family: serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional indicator pips
|
||||||
|
//
|
||||||
|
// Add an unordered list with the following class and add a list item for each
|
||||||
|
// slide your carousel holds.
|
||||||
|
|
||||||
|
.carousel-indicators {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 10px;
|
||||||
|
left: 50%;
|
||||||
|
z-index: 15;
|
||||||
|
width: 60%;
|
||||||
|
margin-left: -30%;
|
||||||
|
padding-left: 0;
|
||||||
|
list-style: none;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: inline-block;
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
margin: 1px;
|
||||||
|
text-indent: -999px;
|
||||||
|
border: 1px solid $carousel-indicator-border-color;
|
||||||
|
border-radius: 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
// IE8-9 hack for event handling
|
||||||
|
//
|
||||||
|
// Internet Explorer 8-9 does not support clicks on elements without a set
|
||||||
|
// `background-color`. We cannot use `filter` since that's not viewed as a
|
||||||
|
// background color by the browser. Thus, a hack is needed.
|
||||||
|
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer
|
||||||
|
//
|
||||||
|
// For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
|
||||||
|
// set alpha transparency for the best results possible.
|
||||||
|
background-color: #000 \9; // IE8
|
||||||
|
background-color: rgba(0,0,0,0); // IE9
|
||||||
|
}
|
||||||
|
.active {
|
||||||
|
margin: 0;
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
background-color: $carousel-indicator-active-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional captions
|
||||||
|
// -----------------------------
|
||||||
|
// Hidden by default for smaller viewports
|
||||||
|
.carousel-caption {
|
||||||
|
position: absolute;
|
||||||
|
left: 15%;
|
||||||
|
right: 15%;
|
||||||
|
bottom: 20px;
|
||||||
|
z-index: 10;
|
||||||
|
padding-top: 20px;
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Scale up controls for tablets and up
|
||||||
|
@media screen and (min-width: $screen-sm-min) {
|
||||||
|
|
||||||
|
// Scale up the controls a smidge
|
||||||
|
.carousel-control {
|
||||||
|
.glyphicon-chevron-left,
|
||||||
|
.glyphicon-chevron-right,
|
||||||
|
.icon-prev,
|
||||||
|
.icon-next {
|
||||||
|
width: ($carousel-control-font-size * 1.5);
|
||||||
|
height: ($carousel-control-font-size * 1.5);
|
||||||
|
margin-top: ($carousel-control-font-size / -2);
|
||||||
|
font-size: ($carousel-control-font-size * 1.5);
|
||||||
|
}
|
||||||
|
.glyphicon-chevron-left,
|
||||||
|
.icon-prev {
|
||||||
|
margin-left: ($carousel-control-font-size / -2);
|
||||||
|
}
|
||||||
|
.glyphicon-chevron-right,
|
||||||
|
.icon-next {
|
||||||
|
margin-right: ($carousel-control-font-size / -2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show and left align the captions
|
||||||
|
.carousel-caption {
|
||||||
|
left: 20%;
|
||||||
|
right: 20%;
|
||||||
|
padding-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move up the indicators
|
||||||
|
.carousel-indicators {
|
||||||
|
bottom: 20px;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
//
|
||||||
|
// Close icons
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
.close {
|
||||||
|
float: right;
|
||||||
|
font-size: ($font-size-base * 1.5);
|
||||||
|
font-weight: $close-font-weight;
|
||||||
|
line-height: 1;
|
||||||
|
color: $close-color;
|
||||||
|
text-shadow: $close-text-shadow;
|
||||||
|
@include opacity(.2);
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $close-color;
|
||||||
|
text-decoration: none;
|
||||||
|
cursor: pointer;
|
||||||
|
@include opacity(.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
// [converter] extracted button& to button.close
|
||||||
|
}
|
||||||
|
|
||||||
|
// Additional properties for button version
|
||||||
|
// iOS requires the button element instead of an anchor tag.
|
||||||
|
// If you want the anchor version, it requires `href="#"`.
|
||||||
|
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
|
||||||
|
button.close {
|
||||||
|
padding: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
background: transparent;
|
||||||
|
border: 0;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
//
|
||||||
|
// Code (inline and block)
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Inline and block code styles
|
||||||
|
code,
|
||||||
|
kbd,
|
||||||
|
pre,
|
||||||
|
samp {
|
||||||
|
font-family: $font-family-monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inline code
|
||||||
|
code {
|
||||||
|
padding: 2px 4px;
|
||||||
|
font-size: 90%;
|
||||||
|
color: $code-color;
|
||||||
|
background-color: $code-bg;
|
||||||
|
border-radius: $border-radius-base;
|
||||||
|
}
|
||||||
|
|
||||||
|
// User input typically entered via keyboard
|
||||||
|
kbd {
|
||||||
|
padding: 2px 4px;
|
||||||
|
font-size: 90%;
|
||||||
|
color: $kbd-color;
|
||||||
|
background-color: $kbd-bg;
|
||||||
|
border-radius: $border-radius-small;
|
||||||
|
box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
|
||||||
|
|
||||||
|
kbd {
|
||||||
|
padding: 0;
|
||||||
|
font-size: 100%;
|
||||||
|
font-weight: bold;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Blocks of code
|
||||||
|
pre {
|
||||||
|
display: block;
|
||||||
|
padding: (($line-height-computed - 1) / 2);
|
||||||
|
margin: 0 0 ($line-height-computed / 2);
|
||||||
|
font-size: ($font-size-base - 1); // 14px to 13px
|
||||||
|
line-height: $line-height-base;
|
||||||
|
word-break: break-all;
|
||||||
|
word-wrap: break-word;
|
||||||
|
color: $pre-color;
|
||||||
|
background-color: $pre-bg;
|
||||||
|
border: 1px solid $pre-border-color;
|
||||||
|
border-radius: $border-radius-base;
|
||||||
|
|
||||||
|
// Account for some code outputs that place code tags in pre tags
|
||||||
|
code {
|
||||||
|
padding: 0;
|
||||||
|
font-size: inherit;
|
||||||
|
color: inherit;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
background-color: transparent;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable scrollable blocks of code
|
||||||
|
.pre-scrollable {
|
||||||
|
max-height: $pre-scrollable-max-height;
|
||||||
|
overflow-y: scroll;
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
//
|
||||||
|
// Component animations
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// Heads up!
|
||||||
|
//
|
||||||
|
// We don't use the `.opacity()` mixin here since it causes a bug with text
|
||||||
|
// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.
|
||||||
|
|
||||||
|
.fade {
|
||||||
|
opacity: 0;
|
||||||
|
@include transition(opacity .15s linear);
|
||||||
|
&.in {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapse {
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
&.in { display: block; }
|
||||||
|
// [converter] extracted tr&.in to tr.collapse.in
|
||||||
|
// [converter] extracted tbody&.in to tbody.collapse.in
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.collapse.in { display: table-row; }
|
||||||
|
|
||||||
|
tbody.collapse.in { display: table-row-group; }
|
||||||
|
|
||||||
|
.collapsing {
|
||||||
|
position: relative;
|
||||||
|
height: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
@include transition-property(height, visibility);
|
||||||
|
@include transition-duration(.35s);
|
||||||
|
@include transition-timing-function(ease);
|
||||||
|
}
|
|
@ -0,0 +1,216 @@
|
||||||
|
//
|
||||||
|
// Dropdown menus
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Dropdown arrow/caret
|
||||||
|
.caret {
|
||||||
|
display: inline-block;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
margin-left: 2px;
|
||||||
|
vertical-align: middle;
|
||||||
|
border-top: $caret-width-base dashed;
|
||||||
|
border-top: $caret-width-base solid \9; // IE8
|
||||||
|
border-right: $caret-width-base solid transparent;
|
||||||
|
border-left: $caret-width-base solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The dropdown wrapper (div)
|
||||||
|
.dropup,
|
||||||
|
.dropdown {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent the focus on the dropdown toggle when closing dropdowns
|
||||||
|
.dropdown-toggle:focus {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The dropdown menu (ul)
|
||||||
|
.dropdown-menu {
|
||||||
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
|
left: 0;
|
||||||
|
z-index: $zindex-dropdown;
|
||||||
|
display: none; // none by default, but block on "open" of the menu
|
||||||
|
float: left;
|
||||||
|
min-width: 160px;
|
||||||
|
padding: 5px 0;
|
||||||
|
margin: 2px 0 0; // override default ul
|
||||||
|
list-style: none;
|
||||||
|
font-size: $font-size-base;
|
||||||
|
text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
|
||||||
|
background-color: $dropdown-bg;
|
||||||
|
border: 1px solid $dropdown-fallback-border; // IE8 fallback
|
||||||
|
border: 1px solid $dropdown-border;
|
||||||
|
border-radius: $border-radius-base;
|
||||||
|
@include box-shadow(0 6px 12px rgba(0,0,0,.175));
|
||||||
|
background-clip: padding-box;
|
||||||
|
|
||||||
|
// Aligns the dropdown menu to right
|
||||||
|
//
|
||||||
|
// Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
|
||||||
|
&.pull-right {
|
||||||
|
right: 0;
|
||||||
|
left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dividers (basically an hr) within the dropdown
|
||||||
|
.divider {
|
||||||
|
@include nav-divider($dropdown-divider-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Links within the dropdown menu
|
||||||
|
> li > a {
|
||||||
|
display: block;
|
||||||
|
padding: 3px 20px;
|
||||||
|
clear: both;
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: $line-height-base;
|
||||||
|
color: $dropdown-link-color;
|
||||||
|
white-space: nowrap; // prevent links from randomly breaking onto new lines
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hover/Focus state
|
||||||
|
.dropdown-menu > li > a {
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
text-decoration: none;
|
||||||
|
color: $dropdown-link-hover-color;
|
||||||
|
background-color: $dropdown-link-hover-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Active state
|
||||||
|
.dropdown-menu > .active > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $dropdown-link-active-color;
|
||||||
|
text-decoration: none;
|
||||||
|
outline: 0;
|
||||||
|
background-color: $dropdown-link-active-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disabled state
|
||||||
|
//
|
||||||
|
// Gray out text and ensure the hover/focus state remains gray
|
||||||
|
|
||||||
|
.dropdown-menu > .disabled > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $dropdown-link-disabled-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nuke hover/focus effects
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: transparent;
|
||||||
|
background-image: none; // Remove CSS gradient
|
||||||
|
@include reset-filter;
|
||||||
|
cursor: $cursor-disabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open state for the dropdown
|
||||||
|
.open {
|
||||||
|
// Show the menu
|
||||||
|
> .dropdown-menu {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the outline when :focus is triggered
|
||||||
|
> a {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Menu positioning
|
||||||
|
//
|
||||||
|
// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
|
||||||
|
// menu with the parent.
|
||||||
|
.dropdown-menu-right {
|
||||||
|
left: auto; // Reset the default from `.dropdown-menu`
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
// With v3, we enabled auto-flipping if you have a dropdown within a right
|
||||||
|
// aligned nav component. To enable the undoing of that, we provide an override
|
||||||
|
// to restore the default dropdown menu alignment.
|
||||||
|
//
|
||||||
|
// This is only for left-aligning a dropdown menu within a `.navbar-right` or
|
||||||
|
// `.pull-right` nav component.
|
||||||
|
.dropdown-menu-left {
|
||||||
|
left: 0;
|
||||||
|
right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dropdown section headers
|
||||||
|
.dropdown-header {
|
||||||
|
display: block;
|
||||||
|
padding: 3px 20px;
|
||||||
|
font-size: $font-size-small;
|
||||||
|
line-height: $line-height-base;
|
||||||
|
color: $dropdown-header-color;
|
||||||
|
white-space: nowrap; // as with > li > a
|
||||||
|
}
|
||||||
|
|
||||||
|
// Backdrop to catch body clicks on mobile, etc.
|
||||||
|
.dropdown-backdrop {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: ($zindex-dropdown - 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Right aligned dropdowns
|
||||||
|
.pull-right > .dropdown-menu {
|
||||||
|
right: 0;
|
||||||
|
left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allow for dropdowns to go bottom up (aka, dropup-menu)
|
||||||
|
//
|
||||||
|
// Just add .dropup after the standard .dropdown class and you're set, bro.
|
||||||
|
// TODO: abstract this so that the navbar fixed styles are not placed here?
|
||||||
|
|
||||||
|
.dropup,
|
||||||
|
.navbar-fixed-bottom .dropdown {
|
||||||
|
// Reverse the caret
|
||||||
|
.caret {
|
||||||
|
border-top: 0;
|
||||||
|
border-bottom: $caret-width-base dashed;
|
||||||
|
border-bottom: $caret-width-base solid \9; // IE8
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
// Different positioning for bottom up menu
|
||||||
|
.dropdown-menu {
|
||||||
|
top: auto;
|
||||||
|
bottom: 100%;
|
||||||
|
margin-bottom: 2px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Component alignment
|
||||||
|
//
|
||||||
|
// Reiterate per navbar.less and the modified component alignment there.
|
||||||
|
|
||||||
|
@media (min-width: $grid-float-breakpoint) {
|
||||||
|
.navbar-right {
|
||||||
|
.dropdown-menu {
|
||||||
|
right: 0; left: auto;
|
||||||
|
}
|
||||||
|
// Necessary for overrides of the default right aligned menu.
|
||||||
|
// Will remove come v4 in all likelihood.
|
||||||
|
.dropdown-menu-left {
|
||||||
|
left: 0; right: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,617 @@
|
||||||
|
//
|
||||||
|
// Forms
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Normalize non-controls
|
||||||
|
//
|
||||||
|
// Restyle and baseline non-control form elements.
|
||||||
|
|
||||||
|
fieldset {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
border: 0;
|
||||||
|
// 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.
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
legend {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0;
|
||||||
|
margin-bottom: $line-height-computed;
|
||||||
|
font-size: ($font-size-base * 1.5);
|
||||||
|
line-height: inherit;
|
||||||
|
color: $legend-color;
|
||||||
|
border: 0;
|
||||||
|
border-bottom: 1px solid $legend-border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
display: inline-block;
|
||||||
|
max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)
|
||||||
|
margin-bottom: 5px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Normalize form controls
|
||||||
|
//
|
||||||
|
// While most of our form styles require extra classes, some basic normalization
|
||||||
|
// is required to ensure optimum display with or without those classes to better
|
||||||
|
// address browser inconsistencies.
|
||||||
|
|
||||||
|
// Override content-box in Normalize (* isn't specific enough)
|
||||||
|
input[type="search"] {
|
||||||
|
@include box-sizing(border-box);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Position radios and checkboxes better
|
||||||
|
input[type="radio"],
|
||||||
|
input[type="checkbox"] {
|
||||||
|
margin: 4px 0 0;
|
||||||
|
margin-top: 1px \9; // IE8-9
|
||||||
|
line-height: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="file"] {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make range inputs behave like textual form controls
|
||||||
|
input[type="range"] {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make multiple select elements height not fixed
|
||||||
|
select[multiple],
|
||||||
|
select[size] {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Focus for file, radio, and checkbox
|
||||||
|
input[type="file"]:focus,
|
||||||
|
input[type="radio"]:focus,
|
||||||
|
input[type="checkbox"]:focus {
|
||||||
|
@include tab-focus;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adjust output element
|
||||||
|
output {
|
||||||
|
display: block;
|
||||||
|
padding-top: ($padding-base-vertical + 1);
|
||||||
|
font-size: $font-size-base;
|
||||||
|
line-height: $line-height-base;
|
||||||
|
color: $input-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Common form controls
|
||||||
|
//
|
||||||
|
// Shared size and type resets for form controls. Apply `.form-control` to any
|
||||||
|
// of the following form controls:
|
||||||
|
//
|
||||||
|
// select
|
||||||
|
// textarea
|
||||||
|
// input[type="text"]
|
||||||
|
// input[type="password"]
|
||||||
|
// input[type="datetime"]
|
||||||
|
// input[type="datetime-local"]
|
||||||
|
// input[type="date"]
|
||||||
|
// input[type="month"]
|
||||||
|
// input[type="time"]
|
||||||
|
// input[type="week"]
|
||||||
|
// input[type="number"]
|
||||||
|
// input[type="email"]
|
||||||
|
// input[type="url"]
|
||||||
|
// input[type="search"]
|
||||||
|
// input[type="tel"]
|
||||||
|
// input[type="color"]
|
||||||
|
|
||||||
|
.form-control {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
|
||||||
|
padding: $padding-base-vertical $padding-base-horizontal;
|
||||||
|
font-size: $font-size-base;
|
||||||
|
line-height: $line-height-base;
|
||||||
|
color: $input-color;
|
||||||
|
background-color: $input-bg;
|
||||||
|
background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
|
||||||
|
border: 1px solid $input-border;
|
||||||
|
border-radius: $input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.
|
||||||
|
@include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
|
||||||
|
@include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);
|
||||||
|
|
||||||
|
// Customize the `:focus` state to imitate native WebKit styles.
|
||||||
|
@include form-control-focus;
|
||||||
|
|
||||||
|
// Placeholder
|
||||||
|
@include placeholder;
|
||||||
|
|
||||||
|
// Unstyle the caret on `<select>`s in IE10+.
|
||||||
|
&::-ms-expand {
|
||||||
|
border: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disabled and read-only inputs
|
||||||
|
//
|
||||||
|
// HTML5 says that controls under a fieldset > legend:first-child won't be
|
||||||
|
// disabled if the fieldset is disabled. Due to implementation difficulty, we
|
||||||
|
// don't honor that edge case; we style them as disabled anyway.
|
||||||
|
&[disabled],
|
||||||
|
&[readonly],
|
||||||
|
fieldset[disabled] & {
|
||||||
|
background-color: $input-bg-disabled;
|
||||||
|
opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655
|
||||||
|
}
|
||||||
|
|
||||||
|
&[disabled],
|
||||||
|
fieldset[disabled] & {
|
||||||
|
cursor: $cursor-disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
// [converter] extracted textarea& to textarea.form-control
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset height for `textarea`s
|
||||||
|
textarea.form-control {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Search inputs in iOS
|
||||||
|
//
|
||||||
|
// This overrides the extra rounded corners on search inputs in iOS so that our
|
||||||
|
// `.form-control` class can properly style them. Note that this cannot simply
|
||||||
|
// be added to `.form-control` as it's not specific enough. For details, see
|
||||||
|
// https://github.com/twbs/bootstrap/issues/11586.
|
||||||
|
|
||||||
|
input[type="search"] {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Special styles for iOS temporal inputs
|
||||||
|
//
|
||||||
|
// In Mobile Safari, setting `display: block` on temporal inputs causes the
|
||||||
|
// text within the input to become vertically misaligned. As a workaround, we
|
||||||
|
// set a pixel line-height that matches the given height of the input, but only
|
||||||
|
// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848
|
||||||
|
//
|
||||||
|
// Note that as of 8.3, iOS doesn't support `datetime` or `week`.
|
||||||
|
|
||||||
|
@media screen and (-webkit-min-device-pixel-ratio: 0) {
|
||||||
|
input[type="date"],
|
||||||
|
input[type="time"],
|
||||||
|
input[type="datetime-local"],
|
||||||
|
input[type="month"] {
|
||||||
|
&.form-control {
|
||||||
|
line-height: $input-height-base;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.input-sm,
|
||||||
|
.input-group-sm & {
|
||||||
|
line-height: $input-height-small;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.input-lg,
|
||||||
|
.input-group-lg & {
|
||||||
|
line-height: $input-height-large;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Form groups
|
||||||
|
//
|
||||||
|
// Designed to help with the organization and spacing of vertical forms. For
|
||||||
|
// horizontal forms, use the predefined grid classes.
|
||||||
|
|
||||||
|
.form-group {
|
||||||
|
margin-bottom: $form-group-margin-bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Checkboxes and radios
|
||||||
|
//
|
||||||
|
// Indent the labels to position radios/checkboxes as hanging controls.
|
||||||
|
|
||||||
|
.radio,
|
||||||
|
.checkbox {
|
||||||
|
position: relative;
|
||||||
|
display: block;
|
||||||
|
margin-top: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
label {
|
||||||
|
min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text
|
||||||
|
padding-left: 20px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-weight: normal;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.radio input[type="radio"],
|
||||||
|
.radio-inline input[type="radio"],
|
||||||
|
.checkbox input[type="checkbox"],
|
||||||
|
.checkbox-inline input[type="checkbox"] {
|
||||||
|
position: absolute;
|
||||||
|
margin-left: -20px;
|
||||||
|
margin-top: 4px \9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.radio + .radio,
|
||||||
|
.checkbox + .checkbox {
|
||||||
|
margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing
|
||||||
|
}
|
||||||
|
|
||||||
|
// Radios and checkboxes on same line
|
||||||
|
.radio-inline,
|
||||||
|
.checkbox-inline {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
padding-left: 20px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
font-weight: normal;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.radio-inline + .radio-inline,
|
||||||
|
.checkbox-inline + .checkbox-inline {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-left: 10px; // space out consecutive inline controls
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply same disabled cursor tweak as for inputs
|
||||||
|
// Some special care is needed because <label>s don't inherit their parent's `cursor`.
|
||||||
|
//
|
||||||
|
// Note: Neither radios nor checkboxes can be readonly.
|
||||||
|
input[type="radio"],
|
||||||
|
input[type="checkbox"] {
|
||||||
|
&[disabled],
|
||||||
|
&.disabled,
|
||||||
|
fieldset[disabled] & {
|
||||||
|
cursor: $cursor-disabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// These classes are used directly on <label>s
|
||||||
|
.radio-inline,
|
||||||
|
.checkbox-inline {
|
||||||
|
&.disabled,
|
||||||
|
fieldset[disabled] & {
|
||||||
|
cursor: $cursor-disabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// These classes are used on elements with <label> descendants
|
||||||
|
.radio,
|
||||||
|
.checkbox {
|
||||||
|
&.disabled,
|
||||||
|
fieldset[disabled] & {
|
||||||
|
label {
|
||||||
|
cursor: $cursor-disabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Static form control text
|
||||||
|
//
|
||||||
|
// Apply class to a `p` element to make any string of text align with labels in
|
||||||
|
// a horizontal form layout.
|
||||||
|
|
||||||
|
.form-control-static {
|
||||||
|
// Size it appropriately next to real form controls
|
||||||
|
padding-top: ($padding-base-vertical + 1);
|
||||||
|
padding-bottom: ($padding-base-vertical + 1);
|
||||||
|
// Remove default margin from `p`
|
||||||
|
margin-bottom: 0;
|
||||||
|
min-height: ($line-height-computed + $font-size-base);
|
||||||
|
|
||||||
|
&.input-lg,
|
||||||
|
&.input-sm {
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Form control sizing
|
||||||
|
//
|
||||||
|
// Build on `.form-control` with modifier classes to decrease or increase the
|
||||||
|
// height and font-size of form controls.
|
||||||
|
//
|
||||||
|
// The `.form-group-* form-control` variations are sadly duplicated to avoid the
|
||||||
|
// issue documented in https://github.com/twbs/bootstrap/issues/15074.
|
||||||
|
|
||||||
|
@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $input-border-radius-small);
|
||||||
|
.form-group-sm {
|
||||||
|
.form-control {
|
||||||
|
height: $input-height-small;
|
||||||
|
padding: $padding-small-vertical $padding-small-horizontal;
|
||||||
|
font-size: $font-size-small;
|
||||||
|
line-height: $line-height-small;
|
||||||
|
border-radius: $input-border-radius-small;
|
||||||
|
}
|
||||||
|
select.form-control {
|
||||||
|
height: $input-height-small;
|
||||||
|
line-height: $input-height-small;
|
||||||
|
}
|
||||||
|
textarea.form-control,
|
||||||
|
select[multiple].form-control {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
.form-control-static {
|
||||||
|
height: $input-height-small;
|
||||||
|
min-height: ($line-height-computed + $font-size-small);
|
||||||
|
padding: ($padding-small-vertical + 1) $padding-small-horizontal;
|
||||||
|
font-size: $font-size-small;
|
||||||
|
line-height: $line-height-small;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $input-border-radius-large);
|
||||||
|
.form-group-lg {
|
||||||
|
.form-control {
|
||||||
|
height: $input-height-large;
|
||||||
|
padding: $padding-large-vertical $padding-large-horizontal;
|
||||||
|
font-size: $font-size-large;
|
||||||
|
line-height: $line-height-large;
|
||||||
|
border-radius: $input-border-radius-large;
|
||||||
|
}
|
||||||
|
select.form-control {
|
||||||
|
height: $input-height-large;
|
||||||
|
line-height: $input-height-large;
|
||||||
|
}
|
||||||
|
textarea.form-control,
|
||||||
|
select[multiple].form-control {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
.form-control-static {
|
||||||
|
height: $input-height-large;
|
||||||
|
min-height: ($line-height-computed + $font-size-large);
|
||||||
|
padding: ($padding-large-vertical + 1) $padding-large-horizontal;
|
||||||
|
font-size: $font-size-large;
|
||||||
|
line-height: $line-height-large;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Form control feedback states
|
||||||
|
//
|
||||||
|
// Apply contextual and semantic states to individual form controls.
|
||||||
|
|
||||||
|
.has-feedback {
|
||||||
|
// Enable absolute positioning
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
// Ensure icons don't overlap text
|
||||||
|
.form-control {
|
||||||
|
padding-right: ($input-height-base * 1.25);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Feedback icon (requires .glyphicon classes)
|
||||||
|
.form-control-feedback {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 2; // Ensure icon is above input groups
|
||||||
|
display: block;
|
||||||
|
width: $input-height-base;
|
||||||
|
height: $input-height-base;
|
||||||
|
line-height: $input-height-base;
|
||||||
|
text-align: center;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
.input-lg + .form-control-feedback,
|
||||||
|
.input-group-lg + .form-control-feedback,
|
||||||
|
.form-group-lg .form-control + .form-control-feedback {
|
||||||
|
width: $input-height-large;
|
||||||
|
height: $input-height-large;
|
||||||
|
line-height: $input-height-large;
|
||||||
|
}
|
||||||
|
.input-sm + .form-control-feedback,
|
||||||
|
.input-group-sm + .form-control-feedback,
|
||||||
|
.form-group-sm .form-control + .form-control-feedback {
|
||||||
|
width: $input-height-small;
|
||||||
|
height: $input-height-small;
|
||||||
|
line-height: $input-height-small;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Feedback states
|
||||||
|
.has-success {
|
||||||
|
@include form-control-validation($state-success-text, $state-success-text, $state-success-bg);
|
||||||
|
}
|
||||||
|
.has-warning {
|
||||||
|
@include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);
|
||||||
|
}
|
||||||
|
.has-error {
|
||||||
|
@include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reposition feedback icon if input has visible label above
|
||||||
|
.has-feedback label {
|
||||||
|
|
||||||
|
& ~ .form-control-feedback {
|
||||||
|
top: ($line-height-computed + 5); // Height of the `label` and its margin
|
||||||
|
}
|
||||||
|
&.sr-only ~ .form-control-feedback {
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Help text
|
||||||
|
//
|
||||||
|
// Apply to any element you wish to create light text for placement immediately
|
||||||
|
// below a form control. Use for general help, formatting, or instructional text.
|
||||||
|
|
||||||
|
.help-block {
|
||||||
|
display: block; // account for any element using help-block
|
||||||
|
margin-top: 5px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
color: lighten($text-color, 25%); // lighten the text some for contrast
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Inline forms
|
||||||
|
//
|
||||||
|
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
|
||||||
|
// forms begin stacked on extra small (mobile) devices and then go inline when
|
||||||
|
// viewports reach <768px.
|
||||||
|
//
|
||||||
|
// Requires wrapping inputs and labels with `.form-group` for proper display of
|
||||||
|
// default HTML form controls and our custom form controls (e.g., input groups).
|
||||||
|
//
|
||||||
|
// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
|
||||||
|
|
||||||
|
// [converter] extracted from `.form-inline` for libsass compatibility
|
||||||
|
@mixin form-inline {
|
||||||
|
|
||||||
|
// Kick in the inline
|
||||||
|
@media (min-width: $screen-sm-min) {
|
||||||
|
// Inline-block all the things for "inline"
|
||||||
|
.form-group {
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
// In navbar-form, allow folks to *not* use `.form-group`
|
||||||
|
.form-control {
|
||||||
|
display: inline-block;
|
||||||
|
width: auto; // Prevent labels from stacking above inputs in `.form-group`
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make static controls behave like regular ones
|
||||||
|
.form-control-static {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group {
|
||||||
|
display: inline-table;
|
||||||
|
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%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.control-label {
|
||||||
|
margin-bottom: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove default margin on radios/checkboxes that were used for stacking, and
|
||||||
|
// then undo the floating of radios and checkboxes to match.
|
||||||
|
.radio,
|
||||||
|
.checkbox {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
|
||||||
|
label {
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.radio input[type="radio"],
|
||||||
|
.checkbox input[type="checkbox"] {
|
||||||
|
position: relative;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-override the feedback icon.
|
||||||
|
.has-feedback .form-control-feedback {
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// [converter] extracted as `@mixin form-inline` for libsass compatibility
|
||||||
|
.form-inline {
|
||||||
|
@include form-inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Horizontal forms
|
||||||
|
//
|
||||||
|
// Horizontal forms are built on grid classes and allow you to create forms with
|
||||||
|
// labels on the left and inputs on the right.
|
||||||
|
|
||||||
|
.form-horizontal {
|
||||||
|
|
||||||
|
// Consistent vertical alignment of radios and checkboxes
|
||||||
|
//
|
||||||
|
// Labels also get some reset styles, but that is scoped to a media query below.
|
||||||
|
.radio,
|
||||||
|
.checkbox,
|
||||||
|
.radio-inline,
|
||||||
|
.checkbox-inline {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
padding-top: ($padding-base-vertical + 1); // Default padding plus a border
|
||||||
|
}
|
||||||
|
// Account for padding we're adding to ensure the alignment and of help text
|
||||||
|
// and other content below items
|
||||||
|
.radio,
|
||||||
|
.checkbox {
|
||||||
|
min-height: ($line-height-computed + ($padding-base-vertical + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make form groups behave like rows
|
||||||
|
.form-group {
|
||||||
|
@include make-row;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset spacing and right align labels, but scope to media queries so that
|
||||||
|
// labels on narrow viewports stack the same as a default form example.
|
||||||
|
@media (min-width: $screen-sm-min) {
|
||||||
|
.control-label {
|
||||||
|
text-align: right;
|
||||||
|
margin-bottom: 0;
|
||||||
|
padding-top: ($padding-base-vertical + 1); // Default padding plus a border
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validation states
|
||||||
|
//
|
||||||
|
// Reposition the icon because it's now within a grid column and columns have
|
||||||
|
// `position: relative;` on them. Also accounts for the grid gutter padding.
|
||||||
|
.has-feedback .form-control-feedback {
|
||||||
|
right: floor(($grid-gutter-width / 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Form group sizes
|
||||||
|
//
|
||||||
|
// Quick utility class for applying `.input-lg` and `.input-sm` styles to the
|
||||||
|
// inputs and labels within a `.form-group`.
|
||||||
|
.form-group-lg {
|
||||||
|
@media (min-width: $screen-sm-min) {
|
||||||
|
.control-label {
|
||||||
|
padding-top: ($padding-large-vertical + 1);
|
||||||
|
font-size: $font-size-large;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.form-group-sm {
|
||||||
|
@media (min-width: $screen-sm-min) {
|
||||||
|
.control-label {
|
||||||
|
padding-top: ($padding-small-vertical + 1);
|
||||||
|
font-size: $font-size-small;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,307 @@
|
||||||
|
//
|
||||||
|
// Glyphicons for Bootstrap
|
||||||
|
//
|
||||||
|
// Since icons are fonts, they can be placed anywhere text is placed and are
|
||||||
|
// thus automatically sized to match the surrounding child. To use, create an
|
||||||
|
// inline element with the appropriate classes, like so:
|
||||||
|
//
|
||||||
|
// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
|
||||||
|
|
||||||
|
@at-root {
|
||||||
|
// Import the fonts
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Glyphicons Halflings';
|
||||||
|
src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));
|
||||||
|
src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),
|
||||||
|
url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'),
|
||||||
|
url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),
|
||||||
|
url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),
|
||||||
|
url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Catchall baseclass
|
||||||
|
.glyphicon {
|
||||||
|
position: relative;
|
||||||
|
top: 1px;
|
||||||
|
display: inline-block;
|
||||||
|
font-family: 'Glyphicons Halflings';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: 1;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Individual icons
|
||||||
|
.glyphicon-asterisk { &:before { content: "\002a"; } }
|
||||||
|
.glyphicon-plus { &:before { content: "\002b"; } }
|
||||||
|
.glyphicon-euro,
|
||||||
|
.glyphicon-eur { &:before { content: "\20ac"; } }
|
||||||
|
.glyphicon-minus { &:before { content: "\2212"; } }
|
||||||
|
.glyphicon-cloud { &:before { content: "\2601"; } }
|
||||||
|
.glyphicon-envelope { &:before { content: "\2709"; } }
|
||||||
|
.glyphicon-pencil { &:before { content: "\270f"; } }
|
||||||
|
.glyphicon-glass { &:before { content: "\e001"; } }
|
||||||
|
.glyphicon-music { &:before { content: "\e002"; } }
|
||||||
|
.glyphicon-search { &:before { content: "\e003"; } }
|
||||||
|
.glyphicon-heart { &:before { content: "\e005"; } }
|
||||||
|
.glyphicon-star { &:before { content: "\e006"; } }
|
||||||
|
.glyphicon-star-empty { &:before { content: "\e007"; } }
|
||||||
|
.glyphicon-user { &:before { content: "\e008"; } }
|
||||||
|
.glyphicon-film { &:before { content: "\e009"; } }
|
||||||
|
.glyphicon-th-large { &:before { content: "\e010"; } }
|
||||||
|
.glyphicon-th { &:before { content: "\e011"; } }
|
||||||
|
.glyphicon-th-list { &:before { content: "\e012"; } }
|
||||||
|
.glyphicon-ok { &:before { content: "\e013"; } }
|
||||||
|
.glyphicon-remove { &:before { content: "\e014"; } }
|
||||||
|
.glyphicon-zoom-in { &:before { content: "\e015"; } }
|
||||||
|
.glyphicon-zoom-out { &:before { content: "\e016"; } }
|
||||||
|
.glyphicon-off { &:before { content: "\e017"; } }
|
||||||
|
.glyphicon-signal { &:before { content: "\e018"; } }
|
||||||
|
.glyphicon-cog { &:before { content: "\e019"; } }
|
||||||
|
.glyphicon-trash { &:before { content: "\e020"; } }
|
||||||
|
.glyphicon-home { &:before { content: "\e021"; } }
|
||||||
|
.glyphicon-file { &:before { content: "\e022"; } }
|
||||||
|
.glyphicon-time { &:before { content: "\e023"; } }
|
||||||
|
.glyphicon-road { &:before { content: "\e024"; } }
|
||||||
|
.glyphicon-download-alt { &:before { content: "\e025"; } }
|
||||||
|
.glyphicon-download { &:before { content: "\e026"; } }
|
||||||
|
.glyphicon-upload { &:before { content: "\e027"; } }
|
||||||
|
.glyphicon-inbox { &:before { content: "\e028"; } }
|
||||||
|
.glyphicon-play-circle { &:before { content: "\e029"; } }
|
||||||
|
.glyphicon-repeat { &:before { content: "\e030"; } }
|
||||||
|
.glyphicon-refresh { &:before { content: "\e031"; } }
|
||||||
|
.glyphicon-list-alt { &:before { content: "\e032"; } }
|
||||||
|
.glyphicon-lock { &:before { content: "\e033"; } }
|
||||||
|
.glyphicon-flag { &:before { content: "\e034"; } }
|
||||||
|
.glyphicon-headphones { &:before { content: "\e035"; } }
|
||||||
|
.glyphicon-volume-off { &:before { content: "\e036"; } }
|
||||||
|
.glyphicon-volume-down { &:before { content: "\e037"; } }
|
||||||
|
.glyphicon-volume-up { &:before { content: "\e038"; } }
|
||||||
|
.glyphicon-qrcode { &:before { content: "\e039"; } }
|
||||||
|
.glyphicon-barcode { &:before { content: "\e040"; } }
|
||||||
|
.glyphicon-tag { &:before { content: "\e041"; } }
|
||||||
|
.glyphicon-tags { &:before { content: "\e042"; } }
|
||||||
|
.glyphicon-book { &:before { content: "\e043"; } }
|
||||||
|
.glyphicon-bookmark { &:before { content: "\e044"; } }
|
||||||
|
.glyphicon-print { &:before { content: "\e045"; } }
|
||||||
|
.glyphicon-camera { &:before { content: "\e046"; } }
|
||||||
|
.glyphicon-font { &:before { content: "\e047"; } }
|
||||||
|
.glyphicon-bold { &:before { content: "\e048"; } }
|
||||||
|
.glyphicon-italic { &:before { content: "\e049"; } }
|
||||||
|
.glyphicon-text-height { &:before { content: "\e050"; } }
|
||||||
|
.glyphicon-text-width { &:before { content: "\e051"; } }
|
||||||
|
.glyphicon-align-left { &:before { content: "\e052"; } }
|
||||||
|
.glyphicon-align-center { &:before { content: "\e053"; } }
|
||||||
|
.glyphicon-align-right { &:before { content: "\e054"; } }
|
||||||
|
.glyphicon-align-justify { &:before { content: "\e055"; } }
|
||||||
|
.glyphicon-list { &:before { content: "\e056"; } }
|
||||||
|
.glyphicon-indent-left { &:before { content: "\e057"; } }
|
||||||
|
.glyphicon-indent-right { &:before { content: "\e058"; } }
|
||||||
|
.glyphicon-facetime-video { &:before { content: "\e059"; } }
|
||||||
|
.glyphicon-picture { &:before { content: "\e060"; } }
|
||||||
|
.glyphicon-map-marker { &:before { content: "\e062"; } }
|
||||||
|
.glyphicon-adjust { &:before { content: "\e063"; } }
|
||||||
|
.glyphicon-tint { &:before { content: "\e064"; } }
|
||||||
|
.glyphicon-edit { &:before { content: "\e065"; } }
|
||||||
|
.glyphicon-share { &:before { content: "\e066"; } }
|
||||||
|
.glyphicon-check { &:before { content: "\e067"; } }
|
||||||
|
.glyphicon-move { &:before { content: "\e068"; } }
|
||||||
|
.glyphicon-step-backward { &:before { content: "\e069"; } }
|
||||||
|
.glyphicon-fast-backward { &:before { content: "\e070"; } }
|
||||||
|
.glyphicon-backward { &:before { content: "\e071"; } }
|
||||||
|
.glyphicon-play { &:before { content: "\e072"; } }
|
||||||
|
.glyphicon-pause { &:before { content: "\e073"; } }
|
||||||
|
.glyphicon-stop { &:before { content: "\e074"; } }
|
||||||
|
.glyphicon-forward { &:before { content: "\e075"; } }
|
||||||
|
.glyphicon-fast-forward { &:before { content: "\e076"; } }
|
||||||
|
.glyphicon-step-forward { &:before { content: "\e077"; } }
|
||||||
|
.glyphicon-eject { &:before { content: "\e078"; } }
|
||||||
|
.glyphicon-chevron-left { &:before { content: "\e079"; } }
|
||||||
|
.glyphicon-chevron-right { &:before { content: "\e080"; } }
|
||||||
|
.glyphicon-plus-sign { &:before { content: "\e081"; } }
|
||||||
|
.glyphicon-minus-sign { &:before { content: "\e082"; } }
|
||||||
|
.glyphicon-remove-sign { &:before { content: "\e083"; } }
|
||||||
|
.glyphicon-ok-sign { &:before { content: "\e084"; } }
|
||||||
|
.glyphicon-question-sign { &:before { content: "\e085"; } }
|
||||||
|
.glyphicon-info-sign { &:before { content: "\e086"; } }
|
||||||
|
.glyphicon-screenshot { &:before { content: "\e087"; } }
|
||||||
|
.glyphicon-remove-circle { &:before { content: "\e088"; } }
|
||||||
|
.glyphicon-ok-circle { &:before { content: "\e089"; } }
|
||||||
|
.glyphicon-ban-circle { &:before { content: "\e090"; } }
|
||||||
|
.glyphicon-arrow-left { &:before { content: "\e091"; } }
|
||||||
|
.glyphicon-arrow-right { &:before { content: "\e092"; } }
|
||||||
|
.glyphicon-arrow-up { &:before { content: "\e093"; } }
|
||||||
|
.glyphicon-arrow-down { &:before { content: "\e094"; } }
|
||||||
|
.glyphicon-share-alt { &:before { content: "\e095"; } }
|
||||||
|
.glyphicon-resize-full { &:before { content: "\e096"; } }
|
||||||
|
.glyphicon-resize-small { &:before { content: "\e097"; } }
|
||||||
|
.glyphicon-exclamation-sign { &:before { content: "\e101"; } }
|
||||||
|
.glyphicon-gift { &:before { content: "\e102"; } }
|
||||||
|
.glyphicon-leaf { &:before { content: "\e103"; } }
|
||||||
|
.glyphicon-fire { &:before { content: "\e104"; } }
|
||||||
|
.glyphicon-eye-open { &:before { content: "\e105"; } }
|
||||||
|
.glyphicon-eye-close { &:before { content: "\e106"; } }
|
||||||
|
.glyphicon-warning-sign { &:before { content: "\e107"; } }
|
||||||
|
.glyphicon-plane { &:before { content: "\e108"; } }
|
||||||
|
.glyphicon-calendar { &:before { content: "\e109"; } }
|
||||||
|
.glyphicon-random { &:before { content: "\e110"; } }
|
||||||
|
.glyphicon-comment { &:before { content: "\e111"; } }
|
||||||
|
.glyphicon-magnet { &:before { content: "\e112"; } }
|
||||||
|
.glyphicon-chevron-up { &:before { content: "\e113"; } }
|
||||||
|
.glyphicon-chevron-down { &:before { content: "\e114"; } }
|
||||||
|
.glyphicon-retweet { &:before { content: "\e115"; } }
|
||||||
|
.glyphicon-shopping-cart { &:before { content: "\e116"; } }
|
||||||
|
.glyphicon-folder-close { &:before { content: "\e117"; } }
|
||||||
|
.glyphicon-folder-open { &:before { content: "\e118"; } }
|
||||||
|
.glyphicon-resize-vertical { &:before { content: "\e119"; } }
|
||||||
|
.glyphicon-resize-horizontal { &:before { content: "\e120"; } }
|
||||||
|
.glyphicon-hdd { &:before { content: "\e121"; } }
|
||||||
|
.glyphicon-bullhorn { &:before { content: "\e122"; } }
|
||||||
|
.glyphicon-bell { &:before { content: "\e123"; } }
|
||||||
|
.glyphicon-certificate { &:before { content: "\e124"; } }
|
||||||
|
.glyphicon-thumbs-up { &:before { content: "\e125"; } }
|
||||||
|
.glyphicon-thumbs-down { &:before { content: "\e126"; } }
|
||||||
|
.glyphicon-hand-right { &:before { content: "\e127"; } }
|
||||||
|
.glyphicon-hand-left { &:before { content: "\e128"; } }
|
||||||
|
.glyphicon-hand-up { &:before { content: "\e129"; } }
|
||||||
|
.glyphicon-hand-down { &:before { content: "\e130"; } }
|
||||||
|
.glyphicon-circle-arrow-right { &:before { content: "\e131"; } }
|
||||||
|
.glyphicon-circle-arrow-left { &:before { content: "\e132"; } }
|
||||||
|
.glyphicon-circle-arrow-up { &:before { content: "\e133"; } }
|
||||||
|
.glyphicon-circle-arrow-down { &:before { content: "\e134"; } }
|
||||||
|
.glyphicon-globe { &:before { content: "\e135"; } }
|
||||||
|
.glyphicon-wrench { &:before { content: "\e136"; } }
|
||||||
|
.glyphicon-tasks { &:before { content: "\e137"; } }
|
||||||
|
.glyphicon-filter { &:before { content: "\e138"; } }
|
||||||
|
.glyphicon-briefcase { &:before { content: "\e139"; } }
|
||||||
|
.glyphicon-fullscreen { &:before { content: "\e140"; } }
|
||||||
|
.glyphicon-dashboard { &:before { content: "\e141"; } }
|
||||||
|
.glyphicon-paperclip { &:before { content: "\e142"; } }
|
||||||
|
.glyphicon-heart-empty { &:before { content: "\e143"; } }
|
||||||
|
.glyphicon-link { &:before { content: "\e144"; } }
|
||||||
|
.glyphicon-phone { &:before { content: "\e145"; } }
|
||||||
|
.glyphicon-pushpin { &:before { content: "\e146"; } }
|
||||||
|
.glyphicon-usd { &:before { content: "\e148"; } }
|
||||||
|
.glyphicon-gbp { &:before { content: "\e149"; } }
|
||||||
|
.glyphicon-sort { &:before { content: "\e150"; } }
|
||||||
|
.glyphicon-sort-by-alphabet { &:before { content: "\e151"; } }
|
||||||
|
.glyphicon-sort-by-alphabet-alt { &:before { content: "\e152"; } }
|
||||||
|
.glyphicon-sort-by-order { &:before { content: "\e153"; } }
|
||||||
|
.glyphicon-sort-by-order-alt { &:before { content: "\e154"; } }
|
||||||
|
.glyphicon-sort-by-attributes { &:before { content: "\e155"; } }
|
||||||
|
.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } }
|
||||||
|
.glyphicon-unchecked { &:before { content: "\e157"; } }
|
||||||
|
.glyphicon-expand { &:before { content: "\e158"; } }
|
||||||
|
.glyphicon-collapse-down { &:before { content: "\e159"; } }
|
||||||
|
.glyphicon-collapse-up { &:before { content: "\e160"; } }
|
||||||
|
.glyphicon-log-in { &:before { content: "\e161"; } }
|
||||||
|
.glyphicon-flash { &:before { content: "\e162"; } }
|
||||||
|
.glyphicon-log-out { &:before { content: "\e163"; } }
|
||||||
|
.glyphicon-new-window { &:before { content: "\e164"; } }
|
||||||
|
.glyphicon-record { &:before { content: "\e165"; } }
|
||||||
|
.glyphicon-save { &:before { content: "\e166"; } }
|
||||||
|
.glyphicon-open { &:before { content: "\e167"; } }
|
||||||
|
.glyphicon-saved { &:before { content: "\e168"; } }
|
||||||
|
.glyphicon-import { &:before { content: "\e169"; } }
|
||||||
|
.glyphicon-export { &:before { content: "\e170"; } }
|
||||||
|
.glyphicon-send { &:before { content: "\e171"; } }
|
||||||
|
.glyphicon-floppy-disk { &:before { content: "\e172"; } }
|
||||||
|
.glyphicon-floppy-saved { &:before { content: "\e173"; } }
|
||||||
|
.glyphicon-floppy-remove { &:before { content: "\e174"; } }
|
||||||
|
.glyphicon-floppy-save { &:before { content: "\e175"; } }
|
||||||
|
.glyphicon-floppy-open { &:before { content: "\e176"; } }
|
||||||
|
.glyphicon-credit-card { &:before { content: "\e177"; } }
|
||||||
|
.glyphicon-transfer { &:before { content: "\e178"; } }
|
||||||
|
.glyphicon-cutlery { &:before { content: "\e179"; } }
|
||||||
|
.glyphicon-header { &:before { content: "\e180"; } }
|
||||||
|
.glyphicon-compressed { &:before { content: "\e181"; } }
|
||||||
|
.glyphicon-earphone { &:before { content: "\e182"; } }
|
||||||
|
.glyphicon-phone-alt { &:before { content: "\e183"; } }
|
||||||
|
.glyphicon-tower { &:before { content: "\e184"; } }
|
||||||
|
.glyphicon-stats { &:before { content: "\e185"; } }
|
||||||
|
.glyphicon-sd-video { &:before { content: "\e186"; } }
|
||||||
|
.glyphicon-hd-video { &:before { content: "\e187"; } }
|
||||||
|
.glyphicon-subtitles { &:before { content: "\e188"; } }
|
||||||
|
.glyphicon-sound-stereo { &:before { content: "\e189"; } }
|
||||||
|
.glyphicon-sound-dolby { &:before { content: "\e190"; } }
|
||||||
|
.glyphicon-sound-5-1 { &:before { content: "\e191"; } }
|
||||||
|
.glyphicon-sound-6-1 { &:before { content: "\e192"; } }
|
||||||
|
.glyphicon-sound-7-1 { &:before { content: "\e193"; } }
|
||||||
|
.glyphicon-copyright-mark { &:before { content: "\e194"; } }
|
||||||
|
.glyphicon-registration-mark { &:before { content: "\e195"; } }
|
||||||
|
.glyphicon-cloud-download { &:before { content: "\e197"; } }
|
||||||
|
.glyphicon-cloud-upload { &:before { content: "\e198"; } }
|
||||||
|
.glyphicon-tree-conifer { &:before { content: "\e199"; } }
|
||||||
|
.glyphicon-tree-deciduous { &:before { content: "\e200"; } }
|
||||||
|
.glyphicon-cd { &:before { content: "\e201"; } }
|
||||||
|
.glyphicon-save-file { &:before { content: "\e202"; } }
|
||||||
|
.glyphicon-open-file { &:before { content: "\e203"; } }
|
||||||
|
.glyphicon-level-up { &:before { content: "\e204"; } }
|
||||||
|
.glyphicon-copy { &:before { content: "\e205"; } }
|
||||||
|
.glyphicon-paste { &:before { content: "\e206"; } }
|
||||||
|
// The following 2 Glyphicons are omitted for the time being because
|
||||||
|
// they currently use Unicode codepoints that are outside the
|
||||||
|
// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle
|
||||||
|
// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.
|
||||||
|
// Notably, the bug affects some older versions of the Android Browser.
|
||||||
|
// More info: https://github.com/twbs/bootstrap/issues/10106
|
||||||
|
// .glyphicon-door { &:before { content: "\1f6aa"; } }
|
||||||
|
// .glyphicon-key { &:before { content: "\1f511"; } }
|
||||||
|
.glyphicon-alert { &:before { content: "\e209"; } }
|
||||||
|
.glyphicon-equalizer { &:before { content: "\e210"; } }
|
||||||
|
.glyphicon-king { &:before { content: "\e211"; } }
|
||||||
|
.glyphicon-queen { &:before { content: "\e212"; } }
|
||||||
|
.glyphicon-pawn { &:before { content: "\e213"; } }
|
||||||
|
.glyphicon-bishop { &:before { content: "\e214"; } }
|
||||||
|
.glyphicon-knight { &:before { content: "\e215"; } }
|
||||||
|
.glyphicon-baby-formula { &:before { content: "\e216"; } }
|
||||||
|
.glyphicon-tent { &:before { content: "\26fa"; } }
|
||||||
|
.glyphicon-blackboard { &:before { content: "\e218"; } }
|
||||||
|
.glyphicon-bed { &:before { content: "\e219"; } }
|
||||||
|
.glyphicon-apple { &:before { content: "\f8ff"; } }
|
||||||
|
.glyphicon-erase { &:before { content: "\e221"; } }
|
||||||
|
.glyphicon-hourglass { &:before { content: "\231b"; } }
|
||||||
|
.glyphicon-lamp { &:before { content: "\e223"; } }
|
||||||
|
.glyphicon-duplicate { &:before { content: "\e224"; } }
|
||||||
|
.glyphicon-piggy-bank { &:before { content: "\e225"; } }
|
||||||
|
.glyphicon-scissors { &:before { content: "\e226"; } }
|
||||||
|
.glyphicon-bitcoin { &:before { content: "\e227"; } }
|
||||||
|
.glyphicon-btc { &:before { content: "\e227"; } }
|
||||||
|
.glyphicon-xbt { &:before { content: "\e227"; } }
|
||||||
|
.glyphicon-yen { &:before { content: "\00a5"; } }
|
||||||
|
.glyphicon-jpy { &:before { content: "\00a5"; } }
|
||||||
|
.glyphicon-ruble { &:before { content: "\20bd"; } }
|
||||||
|
.glyphicon-rub { &:before { content: "\20bd"; } }
|
||||||
|
.glyphicon-scale { &:before { content: "\e230"; } }
|
||||||
|
.glyphicon-ice-lolly { &:before { content: "\e231"; } }
|
||||||
|
.glyphicon-ice-lolly-tasted { &:before { content: "\e232"; } }
|
||||||
|
.glyphicon-education { &:before { content: "\e233"; } }
|
||||||
|
.glyphicon-option-horizontal { &:before { content: "\e234"; } }
|
||||||
|
.glyphicon-option-vertical { &:before { content: "\e235"; } }
|
||||||
|
.glyphicon-menu-hamburger { &:before { content: "\e236"; } }
|
||||||
|
.glyphicon-modal-window { &:before { content: "\e237"; } }
|
||||||
|
.glyphicon-oil { &:before { content: "\e238"; } }
|
||||||
|
.glyphicon-grain { &:before { content: "\e239"; } }
|
||||||
|
.glyphicon-sunglasses { &:before { content: "\e240"; } }
|
||||||
|
.glyphicon-text-size { &:before { content: "\e241"; } }
|
||||||
|
.glyphicon-text-color { &:before { content: "\e242"; } }
|
||||||
|
.glyphicon-text-background { &:before { content: "\e243"; } }
|
||||||
|
.glyphicon-object-align-top { &:before { content: "\e244"; } }
|
||||||
|
.glyphicon-object-align-bottom { &:before { content: "\e245"; } }
|
||||||
|
.glyphicon-object-align-horizontal{ &:before { content: "\e246"; } }
|
||||||
|
.glyphicon-object-align-left { &:before { content: "\e247"; } }
|
||||||
|
.glyphicon-object-align-vertical { &:before { content: "\e248"; } }
|
||||||
|
.glyphicon-object-align-right { &:before { content: "\e249"; } }
|
||||||
|
.glyphicon-triangle-right { &:before { content: "\e250"; } }
|
||||||
|
.glyphicon-triangle-left { &:before { content: "\e251"; } }
|
||||||
|
.glyphicon-triangle-bottom { &:before { content: "\e252"; } }
|
||||||
|
.glyphicon-triangle-top { &:before { content: "\e253"; } }
|
||||||
|
.glyphicon-console { &:before { content: "\e254"; } }
|
||||||
|
.glyphicon-superscript { &:before { content: "\e255"; } }
|
||||||
|
.glyphicon-subscript { &:before { content: "\e256"; } }
|
||||||
|
.glyphicon-menu-left { &:before { content: "\e257"; } }
|
||||||
|
.glyphicon-menu-right { &:before { content: "\e258"; } }
|
||||||
|
.glyphicon-menu-down { &:before { content: "\e259"; } }
|
||||||
|
.glyphicon-menu-up { &:before { content: "\e260"; } }
|
|
@ -0,0 +1,84 @@
|
||||||
|
//
|
||||||
|
// Grid system
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Container widths
|
||||||
|
//
|
||||||
|
// Set the container width, and override it for fixed navbars in media queries.
|
||||||
|
|
||||||
|
.container {
|
||||||
|
@include container-fixed;
|
||||||
|
|
||||||
|
@media (min-width: $screen-sm-min) {
|
||||||
|
width: $container-sm;
|
||||||
|
}
|
||||||
|
@media (min-width: $screen-md-min) {
|
||||||
|
width: $container-md;
|
||||||
|
}
|
||||||
|
@media (min-width: $screen-lg-min) {
|
||||||
|
width: $container-lg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Fluid container
|
||||||
|
//
|
||||||
|
// Utilizes the mixin meant for fixed width containers, but without any defined
|
||||||
|
// width for fluid, full width layouts.
|
||||||
|
|
||||||
|
.container-fluid {
|
||||||
|
@include container-fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Row
|
||||||
|
//
|
||||||
|
// Rows contain and clear the floats of your columns.
|
||||||
|
|
||||||
|
.row {
|
||||||
|
@include make-row;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Columns
|
||||||
|
//
|
||||||
|
// Common styles for small and large grid columns
|
||||||
|
|
||||||
|
@include make-grid-columns;
|
||||||
|
|
||||||
|
|
||||||
|
// Extra small grid
|
||||||
|
//
|
||||||
|
// Columns, offsets, pushes, and pulls for extra small devices like
|
||||||
|
// smartphones.
|
||||||
|
|
||||||
|
@include make-grid(xs);
|
||||||
|
|
||||||
|
|
||||||
|
// Small grid
|
||||||
|
//
|
||||||
|
// Columns, offsets, pushes, and pulls for the small device range, from phones
|
||||||
|
// to tablets.
|
||||||
|
|
||||||
|
@media (min-width: $screen-sm-min) {
|
||||||
|
@include make-grid(sm);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Medium grid
|
||||||
|
//
|
||||||
|
// Columns, offsets, pushes, and pulls for the desktop device range.
|
||||||
|
|
||||||
|
@media (min-width: $screen-md-min) {
|
||||||
|
@include make-grid(md);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Large grid
|
||||||
|
//
|
||||||
|
// Columns, offsets, pushes, and pulls for the large desktop device range.
|
||||||
|
|
||||||
|
@media (min-width: $screen-lg-min) {
|
||||||
|
@include make-grid(lg);
|
||||||
|
}
|
|
@ -0,0 +1,171 @@
|
||||||
|
//
|
||||||
|
// Input groups
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// Base styles
|
||||||
|
// -------------------------
|
||||||
|
.input-group {
|
||||||
|
position: relative; // For dropdowns
|
||||||
|
display: table;
|
||||||
|
border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table
|
||||||
|
|
||||||
|
// Undo padding and float of grid classes
|
||||||
|
&[class*="col-"] {
|
||||||
|
float: none;
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-control {
|
||||||
|
// Ensure that the input is always above the *appended* addon button for
|
||||||
|
// proper border colors.
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
z-index: 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sizing options
|
||||||
|
//
|
||||||
|
// Remix the default form control sizing classes into new ones for easier
|
||||||
|
// manipulation.
|
||||||
|
|
||||||
|
.input-group-lg > .form-control,
|
||||||
|
.input-group-lg > .input-group-addon,
|
||||||
|
.input-group-lg > .input-group-btn > .btn {
|
||||||
|
@extend .input-lg;
|
||||||
|
}
|
||||||
|
.input-group-sm > .form-control,
|
||||||
|
.input-group-sm > .input-group-addon,
|
||||||
|
.input-group-sm > .input-group-btn > .btn {
|
||||||
|
@extend .input-sm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Display as table-cell
|
||||||
|
// -------------------------
|
||||||
|
.input-group-addon,
|
||||||
|
.input-group-btn,
|
||||||
|
.input-group .form-control {
|
||||||
|
display: table-cell;
|
||||||
|
|
||||||
|
&:not(:first-child):not(:last-child) {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Addon and addon wrapper for buttons
|
||||||
|
.input-group-addon,
|
||||||
|
.input-group-btn {
|
||||||
|
width: 1%;
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: middle; // Match the inputs
|
||||||
|
}
|
||||||
|
|
||||||
|
// Text input groups
|
||||||
|
// -------------------------
|
||||||
|
.input-group-addon {
|
||||||
|
padding: $padding-base-vertical $padding-base-horizontal;
|
||||||
|
font-size: $font-size-base;
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: 1;
|
||||||
|
color: $input-color;
|
||||||
|
text-align: center;
|
||||||
|
background-color: $input-group-addon-bg;
|
||||||
|
border: 1px solid $input-group-addon-border-color;
|
||||||
|
border-radius: $input-border-radius;
|
||||||
|
|
||||||
|
// Sizing
|
||||||
|
&.input-sm {
|
||||||
|
padding: $padding-small-vertical $padding-small-horizontal;
|
||||||
|
font-size: $font-size-small;
|
||||||
|
border-radius: $input-border-radius-small;
|
||||||
|
}
|
||||||
|
&.input-lg {
|
||||||
|
padding: $padding-large-vertical $padding-large-horizontal;
|
||||||
|
font-size: $font-size-large;
|
||||||
|
border-radius: $input-border-radius-large;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nuke default margins from checkboxes and radios to vertically center within.
|
||||||
|
input[type="radio"],
|
||||||
|
input[type="checkbox"] {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset rounded corners
|
||||||
|
.input-group .form-control:first-child,
|
||||||
|
.input-group-addon:first-child,
|
||||||
|
.input-group-btn:first-child > .btn,
|
||||||
|
.input-group-btn:first-child > .btn-group > .btn,
|
||||||
|
.input-group-btn:first-child > .dropdown-toggle,
|
||||||
|
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
|
||||||
|
.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
|
||||||
|
@include border-right-radius(0);
|
||||||
|
}
|
||||||
|
.input-group-addon:first-child {
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
.input-group .form-control:last-child,
|
||||||
|
.input-group-addon:last-child,
|
||||||
|
.input-group-btn:last-child > .btn,
|
||||||
|
.input-group-btn:last-child > .btn-group > .btn,
|
||||||
|
.input-group-btn:last-child > .dropdown-toggle,
|
||||||
|
.input-group-btn:first-child > .btn:not(:first-child),
|
||||||
|
.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
|
||||||
|
@include border-left-radius(0);
|
||||||
|
}
|
||||||
|
.input-group-addon:last-child {
|
||||||
|
border-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Button input groups
|
||||||
|
// -------------------------
|
||||||
|
.input-group-btn {
|
||||||
|
position: relative;
|
||||||
|
// Jankily prevent input button groups from wrapping with `white-space` and
|
||||||
|
// `font-size` in combination with `inline-block` on buttons.
|
||||||
|
font-size: 0;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
// Negative margin for spacing, position for bringing hovered/focused/actived
|
||||||
|
// element above the siblings.
|
||||||
|
> .btn {
|
||||||
|
position: relative;
|
||||||
|
+ .btn {
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
// Bring the "active" button to the front
|
||||||
|
&:hover,
|
||||||
|
&:focus,
|
||||||
|
&:active {
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Negative margin to only have a 1px border between the two
|
||||||
|
&:first-child {
|
||||||
|
> .btn,
|
||||||
|
> .btn-group {
|
||||||
|
margin-right: -1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&:last-child {
|
||||||
|
> .btn,
|
||||||
|
> .btn-group {
|
||||||
|
z-index: 2;
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
//
|
||||||
|
// Jumbotron
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
.jumbotron {
|
||||||
|
padding-top: $jumbotron-padding;
|
||||||
|
padding-bottom: $jumbotron-padding;
|
||||||
|
margin-bottom: $jumbotron-padding;
|
||||||
|
color: $jumbotron-color;
|
||||||
|
background-color: $jumbotron-bg;
|
||||||
|
|
||||||
|
h1,
|
||||||
|
.h1 {
|
||||||
|
color: $jumbotron-heading-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-bottom: ($jumbotron-padding / 2);
|
||||||
|
font-size: $jumbotron-font-size;
|
||||||
|
font-weight: 200;
|
||||||
|
}
|
||||||
|
|
||||||
|
> hr {
|
||||||
|
border-top-color: darken($jumbotron-bg, 10%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.container &,
|
||||||
|
.container-fluid & {
|
||||||
|
border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container
|
||||||
|
padding-left: ($grid-gutter-width / 2);
|
||||||
|
padding-right: ($grid-gutter-width / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: $screen-sm-min) {
|
||||||
|
padding-top: ($jumbotron-padding * 1.6);
|
||||||
|
padding-bottom: ($jumbotron-padding * 1.6);
|
||||||
|
|
||||||
|
.container &,
|
||||||
|
.container-fluid & {
|
||||||
|
padding-left: ($jumbotron-padding * 2);
|
||||||
|
padding-right: ($jumbotron-padding * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,
|
||||||
|
.h1 {
|
||||||
|
font-size: $jumbotron-heading-font-size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
//
|
||||||
|
// Labels
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
.label {
|
||||||
|
display: inline;
|
||||||
|
padding: .2em .6em .3em;
|
||||||
|
font-size: 75%;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 1;
|
||||||
|
color: $label-color;
|
||||||
|
text-align: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: baseline;
|
||||||
|
border-radius: .25em;
|
||||||
|
|
||||||
|
// [converter] extracted a& to a.label
|
||||||
|
|
||||||
|
// Empty labels collapse automatically (not available in IE8)
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Quick fix for labels in buttons
|
||||||
|
.btn & {
|
||||||
|
position: relative;
|
||||||
|
top: -1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add hover effects, but only for links
|
||||||
|
a.label {
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $label-link-hover-color;
|
||||||
|
text-decoration: none;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Colors
|
||||||
|
// Contextual variations (linked labels get darker on :hover)
|
||||||
|
|
||||||
|
.label-default {
|
||||||
|
@include label-variant($label-default-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.label-primary {
|
||||||
|
@include label-variant($label-primary-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.label-success {
|
||||||
|
@include label-variant($label-success-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.label-info {
|
||||||
|
@include label-variant($label-info-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.label-warning {
|
||||||
|
@include label-variant($label-warning-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.label-danger {
|
||||||
|
@include label-variant($label-danger-bg);
|
||||||
|
}
|
|
@ -0,0 +1,130 @@
|
||||||
|
//
|
||||||
|
// List groups
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Base class
|
||||||
|
//
|
||||||
|
// Easily usable on <ul>, <ol>, or <div>.
|
||||||
|
|
||||||
|
.list-group {
|
||||||
|
// No need to set list-style: none; since .list-group-item is block level
|
||||||
|
margin-bottom: 20px;
|
||||||
|
padding-left: 0; // reset padding because ul and ol
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Individual list items
|
||||||
|
//
|
||||||
|
// Use on `li`s or `div`s within the `.list-group` parent.
|
||||||
|
|
||||||
|
.list-group-item {
|
||||||
|
position: relative;
|
||||||
|
display: block;
|
||||||
|
padding: 10px 15px;
|
||||||
|
// Place the border on the list items and negative margin up for better styling
|
||||||
|
margin-bottom: -1px;
|
||||||
|
background-color: $list-group-bg;
|
||||||
|
border: 1px solid $list-group-border;
|
||||||
|
|
||||||
|
// Round the first and last items
|
||||||
|
&:first-child {
|
||||||
|
@include border-top-radius($list-group-border-radius);
|
||||||
|
}
|
||||||
|
&:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
@include border-bottom-radius($list-group-border-radius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Interactive list items
|
||||||
|
//
|
||||||
|
// Use anchor or button elements instead of `li`s or `div`s to create interactive items.
|
||||||
|
// Includes an extra `.active` modifier class for showing selected items.
|
||||||
|
|
||||||
|
a.list-group-item,
|
||||||
|
button.list-group-item {
|
||||||
|
color: $list-group-link-color;
|
||||||
|
|
||||||
|
.list-group-item-heading {
|
||||||
|
color: $list-group-link-heading-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hover state
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
text-decoration: none;
|
||||||
|
color: $list-group-link-hover-color;
|
||||||
|
background-color: $list-group-hover-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
button.list-group-item {
|
||||||
|
width: 100%;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-group-item {
|
||||||
|
// Disabled state
|
||||||
|
&.disabled,
|
||||||
|
&.disabled:hover,
|
||||||
|
&.disabled:focus {
|
||||||
|
background-color: $list-group-disabled-bg;
|
||||||
|
color: $list-group-disabled-color;
|
||||||
|
cursor: $cursor-disabled;
|
||||||
|
|
||||||
|
// Force color to inherit for custom content
|
||||||
|
.list-group-item-heading {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
.list-group-item-text {
|
||||||
|
color: $list-group-disabled-text-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Active class on item itself, not parent
|
||||||
|
&.active,
|
||||||
|
&.active:hover,
|
||||||
|
&.active:focus {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Contextual variants
|
||||||
|
//
|
||||||
|
// Add modifier classes to change text and background color on individual items.
|
||||||
|
// Organizationally, this must come after the `:hover` states.
|
||||||
|
|
||||||
|
@include list-group-item-variant(success, $state-success-bg, $state-success-text);
|
||||||
|
@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: 5px;
|
||||||
|
}
|
||||||
|
.list-group-item-text {
|
||||||
|
margin-bottom: 0;
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
.media {
|
||||||
|
// Proper spacing between instances of .media
|
||||||
|
margin-top: 15px;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.media,
|
||||||
|
.media-body {
|
||||||
|
zoom: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.media-body {
|
||||||
|
width: 10000px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.media-object {
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
// Fix collapse in webkit from max-width: 100% and display: table-cell.
|
||||||
|
&.img-thumbnail {
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.media-right,
|
||||||
|
.media > .pull-right {
|
||||||
|
padding-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.media-left,
|
||||||
|
.media > .pull-left {
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.media-left,
|
||||||
|
.media-right,
|
||||||
|
.media-body {
|
||||||
|
display: table-cell;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
.media-middle {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.media-bottom {
|
||||||
|
vertical-align: bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset margins on headings for tighter default spacing
|
||||||
|
.media-heading {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Media list variation
|
||||||
|
//
|
||||||
|
// Undo default ul/ol styles
|
||||||
|
.media-list {
|
||||||
|
padding-left: 0;
|
||||||
|
list-style: none;
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
// Mixins
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// Utilities
|
||||||
|
@import "mixins/hide-text";
|
||||||
|
@import "mixins/opacity";
|
||||||
|
@import "mixins/image";
|
||||||
|
@import "mixins/labels";
|
||||||
|
@import "mixins/reset-filter";
|
||||||
|
@import "mixins/resize";
|
||||||
|
@import "mixins/responsive-visibility";
|
||||||
|
@import "mixins/size";
|
||||||
|
@import "mixins/tab-focus";
|
||||||
|
@import "mixins/reset-text";
|
||||||
|
@import "mixins/text-emphasis";
|
||||||
|
@import "mixins/text-overflow";
|
||||||
|
@import "mixins/vendor-prefixes";
|
||||||
|
|
||||||
|
// Components
|
||||||
|
@import "mixins/alerts";
|
||||||
|
@import "mixins/buttons";
|
||||||
|
@import "mixins/panels";
|
||||||
|
@import "mixins/pagination";
|
||||||
|
@import "mixins/list-group";
|
||||||
|
@import "mixins/nav-divider";
|
||||||
|
@import "mixins/forms";
|
||||||
|
@import "mixins/progress-bar";
|
||||||
|
@import "mixins/table-row";
|
||||||
|
|
||||||
|
// Skins
|
||||||
|
@import "mixins/background-variant";
|
||||||
|
@import "mixins/border-radius";
|
||||||
|
@import "mixins/gradients";
|
||||||
|
|
||||||
|
// Layout
|
||||||
|
@import "mixins/clearfix";
|
||||||
|
@import "mixins/center-block";
|
||||||
|
@import "mixins/nav-vertical-align";
|
||||||
|
@import "mixins/grid-framework";
|
||||||
|
@import "mixins/grid";
|
|
@ -0,0 +1,150 @@
|
||||||
|
//
|
||||||
|
// Modals
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// .modal-open - body class for killing the scroll
|
||||||
|
// .modal - container to scroll within
|
||||||
|
// .modal-dialog - positioning shell for the actual modal
|
||||||
|
// .modal-content - actual modal w/ bg and corners and shit
|
||||||
|
|
||||||
|
// Kill the scroll on the body
|
||||||
|
.modal-open {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Container that the modal scrolls within
|
||||||
|
.modal {
|
||||||
|
display: none;
|
||||||
|
overflow: hidden;
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: $zindex-modal;
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
|
||||||
|
// Prevent Chrome on Windows from adding a focus outline. For details, see
|
||||||
|
// https://github.com/twbs/bootstrap/pull/10951.
|
||||||
|
outline: 0;
|
||||||
|
|
||||||
|
// When fading in the modal, animate it to slide down
|
||||||
|
&.fade .modal-dialog {
|
||||||
|
@include translate(0, -25%);
|
||||||
|
@include transition-transform(0.3s ease-out);
|
||||||
|
}
|
||||||
|
&.in .modal-dialog { @include translate(0, 0) }
|
||||||
|
}
|
||||||
|
.modal-open .modal {
|
||||||
|
overflow-x: hidden;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shell div to position the modal with bottom padding
|
||||||
|
.modal-dialog {
|
||||||
|
position: relative;
|
||||||
|
width: auto;
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actual modal
|
||||||
|
.modal-content {
|
||||||
|
position: relative;
|
||||||
|
background-color: $modal-content-bg;
|
||||||
|
border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
|
||||||
|
border: 1px solid $modal-content-border-color;
|
||||||
|
border-radius: $border-radius-large;
|
||||||
|
@include box-shadow(0 3px 9px rgba(0,0,0,.5));
|
||||||
|
background-clip: padding-box;
|
||||||
|
// Remove focus outline from opened modal
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modal background
|
||||||
|
.modal-backdrop {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: $zindex-modal-background;
|
||||||
|
background-color: $modal-backdrop-bg;
|
||||||
|
// Fade for backdrop
|
||||||
|
&.fade { @include opacity(0); }
|
||||||
|
&.in { @include opacity($modal-backdrop-opacity); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modal header
|
||||||
|
// Top section of the modal w/ title and dismiss
|
||||||
|
.modal-header {
|
||||||
|
padding: $modal-title-padding;
|
||||||
|
border-bottom: 1px solid $modal-header-border-color;
|
||||||
|
@include clearfix;
|
||||||
|
}
|
||||||
|
// Close icon
|
||||||
|
.modal-header .close {
|
||||||
|
margin-top: -2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Title text within header
|
||||||
|
.modal-title {
|
||||||
|
margin: 0;
|
||||||
|
line-height: $modal-title-line-height;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modal body
|
||||||
|
// Where all modal content resides (sibling of .modal-header and .modal-footer)
|
||||||
|
.modal-body {
|
||||||
|
position: relative;
|
||||||
|
padding: $modal-inner-padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Footer (for actions)
|
||||||
|
.modal-footer {
|
||||||
|
padding: $modal-inner-padding;
|
||||||
|
text-align: right; // right align buttons
|
||||||
|
border-top: 1px solid $modal-footer-border-color;
|
||||||
|
@include clearfix; // clear it in case folks use .pull-* classes on buttons
|
||||||
|
|
||||||
|
// Properly space out buttons
|
||||||
|
.btn + .btn {
|
||||||
|
margin-left: 5px;
|
||||||
|
margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
|
||||||
|
}
|
||||||
|
// but override that for button groups
|
||||||
|
.btn-group .btn + .btn {
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
// and override it for block buttons as well
|
||||||
|
.btn-block + .btn-block {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Measure scrollbar width for padding body during modal show/hide
|
||||||
|
.modal-scrollbar-measure {
|
||||||
|
position: absolute;
|
||||||
|
top: -9999px;
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
overflow: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scale up the modal
|
||||||
|
@media (min-width: $screen-sm-min) {
|
||||||
|
// Automatically set modal's width for larger viewports
|
||||||
|
.modal-dialog {
|
||||||
|
width: $modal-md;
|
||||||
|
margin: 30px auto;
|
||||||
|
}
|
||||||
|
.modal-content {
|
||||||
|
@include box-shadow(0 5px 15px rgba(0,0,0,.5));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modal sizes
|
||||||
|
.modal-sm { width: $modal-sm; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: $screen-md-min) {
|
||||||
|
.modal-lg { width: $modal-lg; }
|
||||||
|
}
|
|
@ -0,0 +1,662 @@
|
||||||
|
//
|
||||||
|
// Navbars
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Wrapper and base class
|
||||||
|
//
|
||||||
|
// Provide a static navbar from which we expand to create full-width, fixed, and
|
||||||
|
// other navbar variations.
|
||||||
|
|
||||||
|
.navbar {
|
||||||
|
position: relative;
|
||||||
|
min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
|
||||||
|
margin-bottom: $navbar-margin-bottom;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
|
||||||
|
// Prevent floats from breaking the navbar
|
||||||
|
@include clearfix;
|
||||||
|
|
||||||
|
@media (min-width: $grid-float-breakpoint) {
|
||||||
|
border-radius: $navbar-border-radius;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Navbar heading
|
||||||
|
//
|
||||||
|
// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
|
||||||
|
// styling of responsive aspects.
|
||||||
|
|
||||||
|
.navbar-header {
|
||||||
|
@include clearfix;
|
||||||
|
|
||||||
|
@media (min-width: $grid-float-breakpoint) {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Navbar collapse (body)
|
||||||
|
//
|
||||||
|
// Group your navbar content into this for easy collapsing and expanding across
|
||||||
|
// various device sizes. By default, this content is collapsed when <768px, but
|
||||||
|
// will expand past that for a horizontal display.
|
||||||
|
//
|
||||||
|
// To start (on mobile devices) the navbar links, forms, and buttons are stacked
|
||||||
|
// vertically and include a `max-height` to overflow in case you have too much
|
||||||
|
// content for the user's viewport.
|
||||||
|
|
||||||
|
.navbar-collapse {
|
||||||
|
overflow-x: visible;
|
||||||
|
padding-right: $navbar-padding-horizontal;
|
||||||
|
padding-left: $navbar-padding-horizontal;
|
||||||
|
border-top: 1px solid transparent;
|
||||||
|
box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
|
||||||
|
@include clearfix;
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
|
||||||
|
&.in {
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: $grid-float-breakpoint) {
|
||||||
|
width: auto;
|
||||||
|
border-top: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
|
||||||
|
&.collapse {
|
||||||
|
display: block !important;
|
||||||
|
height: auto !important;
|
||||||
|
padding-bottom: 0; // Override default setting
|
||||||
|
overflow: visible !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.in {
|
||||||
|
overflow-y: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Undo the collapse side padding for navbars with containers to ensure
|
||||||
|
// alignment of right-aligned contents.
|
||||||
|
.navbar-fixed-top &,
|
||||||
|
.navbar-static-top &,
|
||||||
|
.navbar-fixed-bottom & {
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-fixed-top,
|
||||||
|
.navbar-fixed-bottom {
|
||||||
|
.navbar-collapse {
|
||||||
|
max-height: $navbar-collapse-max-height;
|
||||||
|
|
||||||
|
@media (max-device-width: $screen-xs-min) and (orientation: landscape) {
|
||||||
|
max-height: 200px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Both navbar header and collapse
|
||||||
|
//
|
||||||
|
// When a container is present, change the behavior of the header and collapse.
|
||||||
|
|
||||||
|
.container,
|
||||||
|
.container-fluid {
|
||||||
|
> .navbar-header,
|
||||||
|
> .navbar-collapse {
|
||||||
|
margin-right: -$navbar-padding-horizontal;
|
||||||
|
margin-left: -$navbar-padding-horizontal;
|
||||||
|
|
||||||
|
@media (min-width: $grid-float-breakpoint) {
|
||||||
|
margin-right: 0;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Navbar alignment options
|
||||||
|
//
|
||||||
|
// Display the navbar across the entirety of the page or fixed it to the top or
|
||||||
|
// bottom of the page.
|
||||||
|
|
||||||
|
// Static top (unfixed, but 100% wide) navbar
|
||||||
|
.navbar-static-top {
|
||||||
|
z-index: $zindex-navbar;
|
||||||
|
border-width: 0 0 1px;
|
||||||
|
|
||||||
|
@media (min-width: $grid-float-breakpoint) {
|
||||||
|
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
|
||||||
|
@media (min-width: $grid-float-breakpoint) {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.navbar-fixed-top {
|
||||||
|
top: 0;
|
||||||
|
border-width: 0 0 1px;
|
||||||
|
}
|
||||||
|
.navbar-fixed-bottom {
|
||||||
|
bottom: 0;
|
||||||
|
margin-bottom: 0; // override .navbar defaults
|
||||||
|
border-width: 1px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Brand/project name
|
||||||
|
|
||||||
|
.navbar-brand {
|
||||||
|
float: left;
|
||||||
|
padding: $navbar-padding-vertical $navbar-padding-horizontal;
|
||||||
|
font-size: $font-size-large;
|
||||||
|
line-height: $line-height-computed;
|
||||||
|
height: $navbar-height;
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
> img {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: $grid-float-breakpoint) {
|
||||||
|
.navbar > .container &,
|
||||||
|
.navbar > .container-fluid & {
|
||||||
|
margin-left: -$navbar-padding-horizontal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Navbar toggle
|
||||||
|
//
|
||||||
|
// Custom button for toggling the `.navbar-collapse`, powered by the collapse
|
||||||
|
// JavaScript plugin.
|
||||||
|
|
||||||
|
.navbar-toggle {
|
||||||
|
position: relative;
|
||||||
|
float: right;
|
||||||
|
margin-right: $navbar-padding-horizontal;
|
||||||
|
padding: 9px 10px;
|
||||||
|
@include navbar-vertical-align(34px);
|
||||||
|
background-color: transparent;
|
||||||
|
background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: $border-radius-base;
|
||||||
|
|
||||||
|
// We remove the `outline` here, but later compensate by attaching `:hover`
|
||||||
|
// styles to `:focus`.
|
||||||
|
&:focus {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bars
|
||||||
|
.icon-bar {
|
||||||
|
display: block;
|
||||||
|
width: 22px;
|
||||||
|
height: 2px;
|
||||||
|
border-radius: 1px;
|
||||||
|
}
|
||||||
|
.icon-bar + .icon-bar {
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: $grid-float-breakpoint) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Navbar nav links
|
||||||
|
//
|
||||||
|
// Builds on top of the `.nav` components with its own modifier class to make
|
||||||
|
// the nav the full height of the horizontal nav (above 768px).
|
||||||
|
|
||||||
|
.navbar-nav {
|
||||||
|
margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);
|
||||||
|
|
||||||
|
> li > a {
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
line-height: $line-height-computed;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: $grid-float-breakpoint-max) {
|
||||||
|
// Dropdowns get custom display when collapsed
|
||||||
|
.open .dropdown-menu {
|
||||||
|
position: static;
|
||||||
|
float: none;
|
||||||
|
width: auto;
|
||||||
|
margin-top: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
border: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
> li > a,
|
||||||
|
.dropdown-header {
|
||||||
|
padding: 5px 15px 5px 25px;
|
||||||
|
}
|
||||||
|
> li > a {
|
||||||
|
line-height: $line-height-computed;
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uncollapse the nav
|
||||||
|
@media (min-width: $grid-float-breakpoint) {
|
||||||
|
float: left;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
> li {
|
||||||
|
float: left;
|
||||||
|
> a {
|
||||||
|
padding-top: $navbar-padding-vertical;
|
||||||
|
padding-bottom: $navbar-padding-vertical;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Navbar form
|
||||||
|
//
|
||||||
|
// Extension of the `.form-inline` with some extra flavor for optimum display in
|
||||||
|
// our navbars.
|
||||||
|
|
||||||
|
.navbar-form {
|
||||||
|
margin-left: -$navbar-padding-horizontal;
|
||||||
|
margin-right: -$navbar-padding-horizontal;
|
||||||
|
padding: 10px $navbar-padding-horizontal;
|
||||||
|
border-top: 1px solid transparent;
|
||||||
|
border-bottom: 1px solid transparent;
|
||||||
|
$shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
|
||||||
|
@include box-shadow($shadow);
|
||||||
|
|
||||||
|
// Mixin behavior for optimum display
|
||||||
|
@include form-inline;
|
||||||
|
|
||||||
|
.form-group {
|
||||||
|
@media (max-width: $grid-float-breakpoint-max) {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vertically center in expanded, horizontal navbar
|
||||||
|
@include navbar-vertical-align($input-height-base);
|
||||||
|
|
||||||
|
// Undo 100% width for pull classes
|
||||||
|
@media (min-width: $grid-float-breakpoint) {
|
||||||
|
width: auto;
|
||||||
|
border: 0;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
padding-top: 0;
|
||||||
|
padding-bottom: 0;
|
||||||
|
@include box-shadow(none);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Dropdown menus
|
||||||
|
|
||||||
|
// Menu position and menu carets
|
||||||
|
.navbar-nav > li > .dropdown-menu {
|
||||||
|
margin-top: 0;
|
||||||
|
@include border-top-radius(0);
|
||||||
|
}
|
||||||
|
// Menu position and menu caret support for dropups via extra dropup class
|
||||||
|
.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
|
||||||
|
margin-bottom: 0;
|
||||||
|
@include border-top-radius($navbar-border-radius);
|
||||||
|
@include border-bottom-radius(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Buttons in navbars
|
||||||
|
//
|
||||||
|
// Vertically center a button within a navbar (when *not* in a form).
|
||||||
|
|
||||||
|
.navbar-btn {
|
||||||
|
@include navbar-vertical-align($input-height-base);
|
||||||
|
|
||||||
|
&.btn-sm {
|
||||||
|
@include navbar-vertical-align($input-height-small);
|
||||||
|
}
|
||||||
|
&.btn-xs {
|
||||||
|
@include navbar-vertical-align(22);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Text in navbars
|
||||||
|
//
|
||||||
|
// Add a class to make any element properly align itself vertically within the navbars.
|
||||||
|
|
||||||
|
.navbar-text {
|
||||||
|
@include navbar-vertical-align($line-height-computed);
|
||||||
|
|
||||||
|
@media (min-width: $grid-float-breakpoint) {
|
||||||
|
float: left;
|
||||||
|
margin-left: $navbar-padding-horizontal;
|
||||||
|
margin-right: $navbar-padding-horizontal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Component alignment
|
||||||
|
//
|
||||||
|
// Repurpose the pull utilities as their own navbar utilities to avoid specificity
|
||||||
|
// issues with parents and chaining. Only do this when the navbar is uncollapsed
|
||||||
|
// though so that navbar contents properly stack and align in mobile.
|
||||||
|
//
|
||||||
|
// Declared after the navbar components to ensure more specificity on the margins.
|
||||||
|
|
||||||
|
@media (min-width: $grid-float-breakpoint) {
|
||||||
|
.navbar-left {
|
||||||
|
float: left !important;
|
||||||
|
}
|
||||||
|
.navbar-right {
|
||||||
|
float: right !important;
|
||||||
|
margin-right: -$navbar-padding-horizontal;
|
||||||
|
|
||||||
|
~ .navbar-right {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Alternate navbars
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// Default navbar
|
||||||
|
.navbar-default {
|
||||||
|
background-color: $navbar-default-bg;
|
||||||
|
border-color: $navbar-default-border;
|
||||||
|
|
||||||
|
.navbar-brand {
|
||||||
|
color: $navbar-default-brand-color;
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-default-brand-hover-color;
|
||||||
|
background-color: $navbar-default-brand-hover-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-text {
|
||||||
|
color: $navbar-default-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-nav {
|
||||||
|
> li > a {
|
||||||
|
color: $navbar-default-link-color;
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-default-link-hover-color;
|
||||||
|
background-color: $navbar-default-link-hover-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> .active > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-default-link-active-color;
|
||||||
|
background-color: $navbar-default-link-active-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> .disabled > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-default-link-disabled-color;
|
||||||
|
background-color: $navbar-default-link-disabled-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-toggle {
|
||||||
|
border-color: $navbar-default-toggle-border-color;
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
background-color: $navbar-default-toggle-hover-bg;
|
||||||
|
}
|
||||||
|
.icon-bar {
|
||||||
|
background-color: $navbar-default-toggle-icon-bar-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-collapse,
|
||||||
|
.navbar-form {
|
||||||
|
border-color: $navbar-default-border;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dropdown menu items
|
||||||
|
.navbar-nav {
|
||||||
|
// Remove background color from open dropdown
|
||||||
|
> .open > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
background-color: $navbar-default-link-active-bg;
|
||||||
|
color: $navbar-default-link-active-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: $grid-float-breakpoint-max) {
|
||||||
|
// Dropdowns get custom display when collapsed
|
||||||
|
.open .dropdown-menu {
|
||||||
|
> li > a {
|
||||||
|
color: $navbar-default-link-color;
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-default-link-hover-color;
|
||||||
|
background-color: $navbar-default-link-hover-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> .active > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-default-link-active-color;
|
||||||
|
background-color: $navbar-default-link-active-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> .disabled > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-default-link-disabled-color;
|
||||||
|
background-color: $navbar-default-link-disabled-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Links in navbars
|
||||||
|
//
|
||||||
|
// Add a class to ensure links outside the navbar nav are colored correctly.
|
||||||
|
|
||||||
|
.navbar-link {
|
||||||
|
color: $navbar-default-link-color;
|
||||||
|
&:hover {
|
||||||
|
color: $navbar-default-link-hover-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-link {
|
||||||
|
color: $navbar-default-link-color;
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-default-link-hover-color;
|
||||||
|
}
|
||||||
|
&[disabled],
|
||||||
|
fieldset[disabled] & {
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-default-link-disabled-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inverse navbar
|
||||||
|
|
||||||
|
.navbar-inverse {
|
||||||
|
background-color: $navbar-inverse-bg;
|
||||||
|
border-color: $navbar-inverse-border;
|
||||||
|
|
||||||
|
.navbar-brand {
|
||||||
|
color: $navbar-inverse-brand-color;
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-inverse-brand-hover-color;
|
||||||
|
background-color: $navbar-inverse-brand-hover-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-text {
|
||||||
|
color: $navbar-inverse-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-nav {
|
||||||
|
> li > a {
|
||||||
|
color: $navbar-inverse-link-color;
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-inverse-link-hover-color;
|
||||||
|
background-color: $navbar-inverse-link-hover-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> .active > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-inverse-link-active-color;
|
||||||
|
background-color: $navbar-inverse-link-active-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> .disabled > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-inverse-link-disabled-color;
|
||||||
|
background-color: $navbar-inverse-link-disabled-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Darken the responsive nav toggle
|
||||||
|
.navbar-toggle {
|
||||||
|
border-color: $navbar-inverse-toggle-border-color;
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
background-color: $navbar-inverse-toggle-hover-bg;
|
||||||
|
}
|
||||||
|
.icon-bar {
|
||||||
|
background-color: $navbar-inverse-toggle-icon-bar-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-collapse,
|
||||||
|
.navbar-form {
|
||||||
|
border-color: darken($navbar-inverse-bg, 7%);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dropdowns
|
||||||
|
.navbar-nav {
|
||||||
|
> .open > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
background-color: $navbar-inverse-link-active-bg;
|
||||||
|
color: $navbar-inverse-link-active-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: $grid-float-breakpoint-max) {
|
||||||
|
// Dropdowns get custom display
|
||||||
|
.open .dropdown-menu {
|
||||||
|
> .dropdown-header {
|
||||||
|
border-color: $navbar-inverse-border;
|
||||||
|
}
|
||||||
|
.divider {
|
||||||
|
background-color: $navbar-inverse-border;
|
||||||
|
}
|
||||||
|
> li > a {
|
||||||
|
color: $navbar-inverse-link-color;
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-inverse-link-hover-color;
|
||||||
|
background-color: $navbar-inverse-link-hover-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> .active > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-inverse-link-active-color;
|
||||||
|
background-color: $navbar-inverse-link-active-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> .disabled > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-inverse-link-disabled-color;
|
||||||
|
background-color: $navbar-inverse-link-disabled-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-link {
|
||||||
|
color: $navbar-inverse-link-color;
|
||||||
|
&:hover {
|
||||||
|
color: $navbar-inverse-link-hover-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-link {
|
||||||
|
color: $navbar-inverse-link-color;
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-inverse-link-hover-color;
|
||||||
|
}
|
||||||
|
&[disabled],
|
||||||
|
fieldset[disabled] & {
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $navbar-inverse-link-disabled-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,242 @@
|
||||||
|
//
|
||||||
|
// Navs
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Base class
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
.nav {
|
||||||
|
margin-bottom: 0;
|
||||||
|
padding-left: 0; // Override default ul/ol
|
||||||
|
list-style: none;
|
||||||
|
@include clearfix;
|
||||||
|
|
||||||
|
> li {
|
||||||
|
position: relative;
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
> a {
|
||||||
|
position: relative;
|
||||||
|
display: block;
|
||||||
|
padding: $nav-link-padding;
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: $nav-link-hover-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disabled state sets text to gray and nukes hover/tab effects
|
||||||
|
&.disabled > a {
|
||||||
|
color: $nav-disabled-link-color;
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $nav-disabled-link-hover-color;
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: transparent;
|
||||||
|
cursor: $cursor-disabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open dropdowns
|
||||||
|
.open > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
background-color: $nav-link-hover-bg;
|
||||||
|
border-color: $link-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nav dividers (deprecated with v3.0.1)
|
||||||
|
//
|
||||||
|
// This should have been removed in v3 with the dropping of `.nav-list`, but
|
||||||
|
// we missed it. We don't currently support this anywhere, but in the interest
|
||||||
|
// of maintaining backward compatibility in case you use it, it's deprecated.
|
||||||
|
.nav-divider {
|
||||||
|
@include nav-divider;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent IE8 from misplacing imgs
|
||||||
|
//
|
||||||
|
// See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
|
||||||
|
> li > a > img {
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Tabs
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
// Give the tabs something to sit on
|
||||||
|
.nav-tabs {
|
||||||
|
border-bottom: 1px solid $nav-tabs-border-color;
|
||||||
|
> li {
|
||||||
|
float: left;
|
||||||
|
// Make the list-items overlay the bottom border
|
||||||
|
margin-bottom: -1px;
|
||||||
|
|
||||||
|
// Actual tabs (as links)
|
||||||
|
> a {
|
||||||
|
margin-right: 2px;
|
||||||
|
line-height: $line-height-base;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: $border-radius-base $border-radius-base 0 0;
|
||||||
|
&:hover {
|
||||||
|
border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Active state, and its :hover to override normal :hover
|
||||||
|
&.active > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $nav-tabs-active-link-hover-color;
|
||||||
|
background-color: $nav-tabs-active-link-hover-bg;
|
||||||
|
border: 1px solid $nav-tabs-active-link-hover-border-color;
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// pulling this in mainly for less shorthand
|
||||||
|
&.nav-justified {
|
||||||
|
@extend .nav-justified;
|
||||||
|
@extend .nav-tabs-justified;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Pills
|
||||||
|
// -------------------------
|
||||||
|
.nav-pills {
|
||||||
|
> li {
|
||||||
|
float: left;
|
||||||
|
|
||||||
|
// Links rendered as pills
|
||||||
|
> a {
|
||||||
|
border-radius: $nav-pills-border-radius;
|
||||||
|
}
|
||||||
|
+ li {
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Active state
|
||||||
|
&.active > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $nav-pills-active-link-hover-color;
|
||||||
|
background-color: $nav-pills-active-link-hover-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Stacked pills
|
||||||
|
.nav-stacked {
|
||||||
|
> li {
|
||||||
|
float: none;
|
||||||
|
+ li {
|
||||||
|
margin-top: 2px;
|
||||||
|
margin-left: 0; // no need for this gap between nav items
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Nav variations
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// Justified nav links
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.nav-justified {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
> li {
|
||||||
|
float: none;
|
||||||
|
> a {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .dropdown .dropdown-menu {
|
||||||
|
top: auto;
|
||||||
|
left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: $screen-sm-min) {
|
||||||
|
> li {
|
||||||
|
display: table-cell;
|
||||||
|
width: 1%;
|
||||||
|
> a {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move borders to anchors instead of bottom of list
|
||||||
|
//
|
||||||
|
// Mixin for adding on top the shared `.nav-justified` styles for our tabs
|
||||||
|
.nav-tabs-justified {
|
||||||
|
border-bottom: 0;
|
||||||
|
|
||||||
|
> li > a {
|
||||||
|
// Override margin from .nav-tabs
|
||||||
|
margin-right: 0;
|
||||||
|
border-radius: $border-radius-base;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .active > a,
|
||||||
|
> .active > a:hover,
|
||||||
|
> .active > a:focus {
|
||||||
|
border: 1px solid $nav-tabs-justified-link-border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: $screen-sm-min) {
|
||||||
|
> li > a {
|
||||||
|
border-bottom: 1px solid $nav-tabs-justified-link-border-color;
|
||||||
|
border-radius: $border-radius-base $border-radius-base 0 0;
|
||||||
|
}
|
||||||
|
> .active > a,
|
||||||
|
> .active > a:hover,
|
||||||
|
> .active > a:focus {
|
||||||
|
border-bottom-color: $nav-tabs-justified-active-link-border-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Tabbable tabs
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
// Hide tabbable panes to start, show them when `.active`
|
||||||
|
.tab-content {
|
||||||
|
> .tab-pane {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
> .active {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Dropdowns
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
// Specific dropdowns
|
||||||
|
.nav-tabs .dropdown-menu {
|
||||||
|
// make dropdown border overlap tab border
|
||||||
|
margin-top: -1px;
|
||||||
|
// Remove the top rounded corners here since there is a hard edge above the menu
|
||||||
|
@include border-top-radius(0);
|
||||||
|
}
|
|
@ -0,0 +1,424 @@
|
||||||
|
/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
|
||||||
|
|
||||||
|
//
|
||||||
|
// 1. Set default font family to sans-serif.
|
||||||
|
// 2. Prevent iOS and IE text size adjust after device orientation change,
|
||||||
|
// without disabling user zoom.
|
||||||
|
//
|
||||||
|
|
||||||
|
html {
|
||||||
|
font-family: sans-serif; // 1
|
||||||
|
-ms-text-size-adjust: 100%; // 2
|
||||||
|
-webkit-text-size-adjust: 100%; // 2
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Remove default margin.
|
||||||
|
//
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTML5 display definitions
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
//
|
||||||
|
// Correct `block` display not defined for any HTML5 element in IE 8/9.
|
||||||
|
// Correct `block` display not defined for `details` or `summary` in IE 10/11
|
||||||
|
// and Firefox.
|
||||||
|
// Correct `block` display not defined for `main` in IE 11.
|
||||||
|
//
|
||||||
|
|
||||||
|
article,
|
||||||
|
aside,
|
||||||
|
details,
|
||||||
|
figcaption,
|
||||||
|
figure,
|
||||||
|
footer,
|
||||||
|
header,
|
||||||
|
hgroup,
|
||||||
|
main,
|
||||||
|
menu,
|
||||||
|
nav,
|
||||||
|
section,
|
||||||
|
summary {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// 1. Correct `inline-block` display not defined in IE 8/9.
|
||||||
|
// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
|
||||||
|
//
|
||||||
|
|
||||||
|
audio,
|
||||||
|
canvas,
|
||||||
|
progress,
|
||||||
|
video {
|
||||||
|
display: inline-block; // 1
|
||||||
|
vertical-align: baseline; // 2
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Prevent modern browsers from displaying `audio` without controls.
|
||||||
|
// Remove excess height in iOS 5 devices.
|
||||||
|
//
|
||||||
|
|
||||||
|
audio:not([controls]) {
|
||||||
|
display: none;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address `[hidden]` styling not present in IE 8/9/10.
|
||||||
|
// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
|
||||||
|
//
|
||||||
|
|
||||||
|
[hidden],
|
||||||
|
template {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Links
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
//
|
||||||
|
// Remove the gray background color from active links in IE 10.
|
||||||
|
//
|
||||||
|
|
||||||
|
a {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Improve readability of focused elements when they are also in an
|
||||||
|
// active/hover state.
|
||||||
|
//
|
||||||
|
|
||||||
|
a:active,
|
||||||
|
a:hover {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Text-level semantics
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address styling not present in IE 8/9/10/11, Safari, and Chrome.
|
||||||
|
//
|
||||||
|
|
||||||
|
abbr[title] {
|
||||||
|
border-bottom: 1px dotted;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
|
||||||
|
//
|
||||||
|
|
||||||
|
b,
|
||||||
|
strong {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address styling not present in Safari and Chrome.
|
||||||
|
//
|
||||||
|
|
||||||
|
dfn {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address variable `h1` font-size and margin within `section` and `article`
|
||||||
|
// contexts in Firefox 4+, Safari, and Chrome.
|
||||||
|
//
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 2em;
|
||||||
|
margin: 0.67em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address styling not present in IE 8/9.
|
||||||
|
//
|
||||||
|
|
||||||
|
mark {
|
||||||
|
background: #ff0;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address inconsistent and variable font size in all browsers.
|
||||||
|
//
|
||||||
|
|
||||||
|
small {
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Prevent `sub` and `sup` affecting `line-height` in all browsers.
|
||||||
|
//
|
||||||
|
|
||||||
|
sub,
|
||||||
|
sup {
|
||||||
|
font-size: 75%;
|
||||||
|
line-height: 0;
|
||||||
|
position: relative;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
sup {
|
||||||
|
top: -0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub {
|
||||||
|
bottom: -0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Embedded content
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
//
|
||||||
|
// Remove border when inside `a` element in IE 8/9/10.
|
||||||
|
//
|
||||||
|
|
||||||
|
img {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Correct overflow not hidden in IE 9/10/11.
|
||||||
|
//
|
||||||
|
|
||||||
|
svg:not(:root) {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Grouping content
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address margin not present in IE 8/9 and Safari.
|
||||||
|
//
|
||||||
|
|
||||||
|
figure {
|
||||||
|
margin: 1em 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address differences between Firefox and other browsers.
|
||||||
|
//
|
||||||
|
|
||||||
|
hr {
|
||||||
|
box-sizing: content-box;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Contain overflow in all browsers.
|
||||||
|
//
|
||||||
|
|
||||||
|
pre {
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address odd `em`-unit font size rendering in all browsers.
|
||||||
|
//
|
||||||
|
|
||||||
|
code,
|
||||||
|
kbd,
|
||||||
|
pre,
|
||||||
|
samp {
|
||||||
|
font-family: monospace, monospace;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Forms
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
//
|
||||||
|
// Known limitation: by default, Chrome and Safari on OS X allow very limited
|
||||||
|
// styling of `select`, unless a `border` property is set.
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// 1. Correct color not being inherited.
|
||||||
|
// Known issue: affects color of disabled elements.
|
||||||
|
// 2. Correct font properties not being inherited.
|
||||||
|
// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
|
||||||
|
//
|
||||||
|
|
||||||
|
button,
|
||||||
|
input,
|
||||||
|
optgroup,
|
||||||
|
select,
|
||||||
|
textarea {
|
||||||
|
color: inherit; // 1
|
||||||
|
font: inherit; // 2
|
||||||
|
margin: 0; // 3
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address `overflow` set to `hidden` in IE 8/9/10/11.
|
||||||
|
//
|
||||||
|
|
||||||
|
button {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address inconsistent `text-transform` inheritance for `button` and `select`.
|
||||||
|
// All other form control elements do not inherit `text-transform` values.
|
||||||
|
// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
|
||||||
|
// Correct `select` style inheritance in Firefox.
|
||||||
|
//
|
||||||
|
|
||||||
|
button,
|
||||||
|
select {
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
|
||||||
|
// and `video` controls.
|
||||||
|
// 2. Correct inability to style clickable `input` types in iOS.
|
||||||
|
// 3. Improve usability and consistency of cursor style between image-type
|
||||||
|
// `input` and others.
|
||||||
|
//
|
||||||
|
|
||||||
|
button,
|
||||||
|
html input[type="button"], // 1
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="submit"] {
|
||||||
|
-webkit-appearance: button; // 2
|
||||||
|
cursor: pointer; // 3
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Re-set default cursor for disabled elements.
|
||||||
|
//
|
||||||
|
|
||||||
|
button[disabled],
|
||||||
|
html input[disabled] {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Remove inner padding and border in Firefox 4+.
|
||||||
|
//
|
||||||
|
|
||||||
|
button::-moz-focus-inner,
|
||||||
|
input::-moz-focus-inner {
|
||||||
|
border: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address Firefox 4+ setting `line-height` on `input` using `!important` in
|
||||||
|
// the UA stylesheet.
|
||||||
|
//
|
||||||
|
|
||||||
|
input {
|
||||||
|
line-height: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// It's recommended that you don't attempt to style these elements.
|
||||||
|
// Firefox's implementation doesn't respect box-sizing, padding, or width.
|
||||||
|
//
|
||||||
|
// 1. Address box sizing set to `content-box` in IE 8/9/10.
|
||||||
|
// 2. Remove excess padding in IE 8/9/10.
|
||||||
|
//
|
||||||
|
|
||||||
|
input[type="checkbox"],
|
||||||
|
input[type="radio"] {
|
||||||
|
box-sizing: border-box; // 1
|
||||||
|
padding: 0; // 2
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fix the cursor style for Chrome's increment/decrement buttons. For certain
|
||||||
|
// `font-size` values of the `input`, it causes the cursor style of the
|
||||||
|
// decrement button to change from `default` to `text`.
|
||||||
|
//
|
||||||
|
|
||||||
|
input[type="number"]::-webkit-inner-spin-button,
|
||||||
|
input[type="number"]::-webkit-outer-spin-button {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// 1. Address `appearance` set to `searchfield` in Safari and Chrome.
|
||||||
|
// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
|
||||||
|
//
|
||||||
|
|
||||||
|
input[type="search"] {
|
||||||
|
-webkit-appearance: textfield; // 1
|
||||||
|
box-sizing: content-box; //2
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Remove inner padding and search cancel button in Safari and Chrome on OS X.
|
||||||
|
// Safari (but not Chrome) clips the cancel button when the search input has
|
||||||
|
// padding (and `textfield` appearance).
|
||||||
|
//
|
||||||
|
|
||||||
|
input[type="search"]::-webkit-search-cancel-button,
|
||||||
|
input[type="search"]::-webkit-search-decoration {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define consistent border, margin, and padding.
|
||||||
|
//
|
||||||
|
|
||||||
|
fieldset {
|
||||||
|
border: 1px solid #c0c0c0;
|
||||||
|
margin: 0 2px;
|
||||||
|
padding: 0.35em 0.625em 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// 1. Correct `color` not being inherited in IE 8/9/10/11.
|
||||||
|
// 2. Remove padding so people aren't caught out if they zero out fieldsets.
|
||||||
|
//
|
||||||
|
|
||||||
|
legend {
|
||||||
|
border: 0; // 1
|
||||||
|
padding: 0; // 2
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Remove default vertical scrollbar in IE 8/9/10/11.
|
||||||
|
//
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Don't inherit the `font-weight` (applied by a rule above).
|
||||||
|
// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
|
||||||
|
//
|
||||||
|
|
||||||
|
optgroup {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tables
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
//
|
||||||
|
// Remove most spacing between table cells.
|
||||||
|
//
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
td,
|
||||||
|
th {
|
||||||
|
padding: 0;
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
//
|
||||||
|
// Pager pagination
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
.pager {
|
||||||
|
padding-left: 0;
|
||||||
|
margin: $line-height-computed 0;
|
||||||
|
list-style: none;
|
||||||
|
text-align: center;
|
||||||
|
@include clearfix;
|
||||||
|
li {
|
||||||
|
display: inline;
|
||||||
|
> a,
|
||||||
|
> span {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 5px 14px;
|
||||||
|
background-color: $pager-bg;
|
||||||
|
border: 1px solid $pager-border;
|
||||||
|
border-radius: $pager-border-radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
> a:hover,
|
||||||
|
> a:focus {
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: $pager-hover-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.next {
|
||||||
|
> a,
|
||||||
|
> span {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.previous {
|
||||||
|
> a,
|
||||||
|
> span {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.disabled {
|
||||||
|
> a,
|
||||||
|
> a:hover,
|
||||||
|
> a:focus,
|
||||||
|
> span {
|
||||||
|
color: $pager-disabled-color;
|
||||||
|
background-color: $pager-bg;
|
||||||
|
cursor: $cursor-disabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
//
|
||||||
|
// Pagination (multiple pages)
|
||||||
|
// --------------------------------------------------
|
||||||
|
.pagination {
|
||||||
|
display: inline-block;
|
||||||
|
padding-left: 0;
|
||||||
|
margin: $line-height-computed 0;
|
||||||
|
border-radius: $border-radius-base;
|
||||||
|
|
||||||
|
> li {
|
||||||
|
display: inline; // Remove list-style and block-level defaults
|
||||||
|
> a,
|
||||||
|
> span {
|
||||||
|
position: relative;
|
||||||
|
float: left; // Collapse white-space
|
||||||
|
padding: $padding-base-vertical $padding-base-horizontal;
|
||||||
|
line-height: $line-height-base;
|
||||||
|
text-decoration: none;
|
||||||
|
color: $pagination-color;
|
||||||
|
background-color: $pagination-bg;
|
||||||
|
border: 1px solid $pagination-border;
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
&:first-child {
|
||||||
|
> a,
|
||||||
|
> span {
|
||||||
|
margin-left: 0;
|
||||||
|
@include border-left-radius($border-radius-base);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&:last-child {
|
||||||
|
> a,
|
||||||
|
> span {
|
||||||
|
@include border-right-radius($border-radius-base);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> li > a,
|
||||||
|
> li > span {
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
z-index: 2;
|
||||||
|
color: $pagination-hover-color;
|
||||||
|
background-color: $pagination-hover-bg;
|
||||||
|
border-color: $pagination-hover-border;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .active > a,
|
||||||
|
> .active > span {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
z-index: 3;
|
||||||
|
color: $pagination-active-color;
|
||||||
|
background-color: $pagination-active-bg;
|
||||||
|
border-color: $pagination-active-border;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .disabled {
|
||||||
|
> span,
|
||||||
|
> span:hover,
|
||||||
|
> span:focus,
|
||||||
|
> a,
|
||||||
|
> a:hover,
|
||||||
|
> a:focus {
|
||||||
|
color: $pagination-disabled-color;
|
||||||
|
background-color: $pagination-disabled-bg;
|
||||||
|
border-color: $pagination-disabled-border;
|
||||||
|
cursor: $cursor-disabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sizing
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// Large
|
||||||
|
.pagination-lg {
|
||||||
|
@include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Small
|
||||||
|
.pagination-sm {
|
||||||
|
@include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);
|
||||||
|
}
|
|
@ -0,0 +1,271 @@
|
||||||
|
//
|
||||||
|
// Panels
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Base class
|
||||||
|
.panel {
|
||||||
|
margin-bottom: $line-height-computed;
|
||||||
|
background-color: $panel-bg;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: $panel-border-radius;
|
||||||
|
@include box-shadow(0 1px 1px rgba(0,0,0,.05));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Panel contents
|
||||||
|
.panel-body {
|
||||||
|
padding: $panel-body-padding;
|
||||||
|
@include clearfix;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional heading
|
||||||
|
.panel-heading {
|
||||||
|
padding: $panel-heading-padding;
|
||||||
|
border-bottom: 1px solid transparent;
|
||||||
|
@include border-top-radius(($panel-border-radius - 1));
|
||||||
|
|
||||||
|
> .dropdown .dropdown-toggle {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Within heading, strip any `h*` tag of its default margins for spacing.
|
||||||
|
.panel-title {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-size: ceil(($font-size-base * 1.125));
|
||||||
|
color: inherit;
|
||||||
|
|
||||||
|
> a,
|
||||||
|
> small,
|
||||||
|
> .small,
|
||||||
|
> small > a,
|
||||||
|
> .small > a {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional footer (stays gray in every modifier class)
|
||||||
|
.panel-footer {
|
||||||
|
padding: $panel-footer-padding;
|
||||||
|
background-color: $panel-footer-bg;
|
||||||
|
border-top: 1px solid $panel-inner-border;
|
||||||
|
@include border-bottom-radius(($panel-border-radius - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// List groups in panels
|
||||||
|
//
|
||||||
|
// By default, space out list group content from panel headings to account for
|
||||||
|
// any kind of custom content between the two.
|
||||||
|
|
||||||
|
.panel {
|
||||||
|
> .list-group,
|
||||||
|
> .panel-collapse > .list-group {
|
||||||
|
margin-bottom: 0;
|
||||||
|
|
||||||
|
.list-group-item {
|
||||||
|
border-width: 1px 0;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add border top radius for first one
|
||||||
|
&:first-child {
|
||||||
|
.list-group-item:first-child {
|
||||||
|
border-top: 0;
|
||||||
|
@include border-top-radius(($panel-border-radius - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add border bottom radius for last one
|
||||||
|
&:last-child {
|
||||||
|
.list-group-item:last-child {
|
||||||
|
border-bottom: 0;
|
||||||
|
@include border-bottom-radius(($panel-border-radius - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> .panel-heading + .panel-collapse > .list-group {
|
||||||
|
.list-group-item:first-child {
|
||||||
|
@include border-top-radius(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Collapse space between when there's no additional content.
|
||||||
|
.panel-heading + .list-group {
|
||||||
|
.list-group-item:first-child {
|
||||||
|
border-top-width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.list-group + .panel-footer {
|
||||||
|
border-top-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tables in panels
|
||||||
|
//
|
||||||
|
// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
|
||||||
|
// watch it go full width.
|
||||||
|
|
||||||
|
.panel {
|
||||||
|
> .table,
|
||||||
|
> .table-responsive > .table,
|
||||||
|
> .panel-collapse > .table {
|
||||||
|
margin-bottom: 0;
|
||||||
|
|
||||||
|
caption {
|
||||||
|
padding-left: $panel-body-padding;
|
||||||
|
padding-right: $panel-body-padding;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Add border top radius for first one
|
||||||
|
> .table:first-child,
|
||||||
|
> .table-responsive:first-child > .table:first-child {
|
||||||
|
@include border-top-radius(($panel-border-radius - 1));
|
||||||
|
|
||||||
|
> thead:first-child,
|
||||||
|
> tbody:first-child {
|
||||||
|
> tr:first-child {
|
||||||
|
border-top-left-radius: ($panel-border-radius - 1);
|
||||||
|
border-top-right-radius: ($panel-border-radius - 1);
|
||||||
|
|
||||||
|
td:first-child,
|
||||||
|
th:first-child {
|
||||||
|
border-top-left-radius: ($panel-border-radius - 1);
|
||||||
|
}
|
||||||
|
td:last-child,
|
||||||
|
th:last-child {
|
||||||
|
border-top-right-radius: ($panel-border-radius - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Add border bottom radius for last one
|
||||||
|
> .table:last-child,
|
||||||
|
> .table-responsive:last-child > .table:last-child {
|
||||||
|
@include border-bottom-radius(($panel-border-radius - 1));
|
||||||
|
|
||||||
|
> tbody:last-child,
|
||||||
|
> tfoot:last-child {
|
||||||
|
> tr:last-child {
|
||||||
|
border-bottom-left-radius: ($panel-border-radius - 1);
|
||||||
|
border-bottom-right-radius: ($panel-border-radius - 1);
|
||||||
|
|
||||||
|
td:first-child,
|
||||||
|
th:first-child {
|
||||||
|
border-bottom-left-radius: ($panel-border-radius - 1);
|
||||||
|
}
|
||||||
|
td:last-child,
|
||||||
|
th:last-child {
|
||||||
|
border-bottom-right-radius: ($panel-border-radius - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> .panel-body + .table,
|
||||||
|
> .panel-body + .table-responsive,
|
||||||
|
> .table + .panel-body,
|
||||||
|
> .table-responsive + .panel-body {
|
||||||
|
border-top: 1px solid $table-border-color;
|
||||||
|
}
|
||||||
|
> .table > tbody:first-child > tr:first-child th,
|
||||||
|
> .table > tbody:first-child > tr:first-child td {
|
||||||
|
border-top: 0;
|
||||||
|
}
|
||||||
|
> .table-bordered,
|
||||||
|
> .table-responsive > .table-bordered {
|
||||||
|
border: 0;
|
||||||
|
> thead,
|
||||||
|
> tbody,
|
||||||
|
> tfoot {
|
||||||
|
> tr {
|
||||||
|
> th:first-child,
|
||||||
|
> td:first-child {
|
||||||
|
border-left: 0;
|
||||||
|
}
|
||||||
|
> th:last-child,
|
||||||
|
> td:last-child {
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> thead,
|
||||||
|
> tbody {
|
||||||
|
> tr:first-child {
|
||||||
|
> td,
|
||||||
|
> th {
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> tbody,
|
||||||
|
> tfoot {
|
||||||
|
> tr:last-child {
|
||||||
|
> td,
|
||||||
|
> th {
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> .table-responsive {
|
||||||
|
border: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Collapsable panels (aka, accordion)
|
||||||
|
//
|
||||||
|
// Wrap a series of panels in `.panel-group` to turn them into an accordion with
|
||||||
|
// the help of our collapse JavaScript plugin.
|
||||||
|
|
||||||
|
.panel-group {
|
||||||
|
margin-bottom: $line-height-computed;
|
||||||
|
|
||||||
|
// Tighten up margin so it's only between panels
|
||||||
|
.panel {
|
||||||
|
margin-bottom: 0;
|
||||||
|
border-radius: $panel-border-radius;
|
||||||
|
|
||||||
|
+ .panel {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-heading {
|
||||||
|
border-bottom: 0;
|
||||||
|
|
||||||
|
+ .panel-collapse > .panel-body,
|
||||||
|
+ .panel-collapse > .list-group {
|
||||||
|
border-top: 1px solid $panel-inner-border;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-footer {
|
||||||
|
border-top: 0;
|
||||||
|
+ .panel-collapse .panel-body {
|
||||||
|
border-bottom: 1px solid $panel-inner-border;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Contextual variations
|
||||||
|
.panel-default {
|
||||||
|
@include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);
|
||||||
|
}
|
||||||
|
.panel-primary {
|
||||||
|
@include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);
|
||||||
|
}
|
||||||
|
.panel-success {
|
||||||
|
@include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);
|
||||||
|
}
|
||||||
|
.panel-info {
|
||||||
|
@include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);
|
||||||
|
}
|
||||||
|
.panel-warning {
|
||||||
|
@include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);
|
||||||
|
}
|
||||||
|
.panel-danger {
|
||||||
|
@include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);
|
||||||
|
}
|
|
@ -0,0 +1,131 @@
|
||||||
|
//
|
||||||
|
// Popovers
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
.popover {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: $zindex-popover;
|
||||||
|
display: none;
|
||||||
|
max-width: $popover-max-width;
|
||||||
|
padding: 1px;
|
||||||
|
// Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.
|
||||||
|
// So reset our font and text properties to avoid inheriting weird values.
|
||||||
|
@include reset-text;
|
||||||
|
font-size: $font-size-base;
|
||||||
|
|
||||||
|
background-color: $popover-bg;
|
||||||
|
background-clip: padding-box;
|
||||||
|
border: 1px solid $popover-fallback-border-color;
|
||||||
|
border: 1px solid $popover-border-color;
|
||||||
|
border-radius: $border-radius-large;
|
||||||
|
@include box-shadow(0 5px 10px rgba(0,0,0,.2));
|
||||||
|
|
||||||
|
// Offset the popover to account for the popover arrow
|
||||||
|
&.top { margin-top: -$popover-arrow-width; }
|
||||||
|
&.right { margin-left: $popover-arrow-width; }
|
||||||
|
&.bottom { margin-top: $popover-arrow-width; }
|
||||||
|
&.left { margin-left: -$popover-arrow-width; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.popover-title {
|
||||||
|
margin: 0; // reset heading margin
|
||||||
|
padding: 8px 14px;
|
||||||
|
font-size: $font-size-base;
|
||||||
|
background-color: $popover-title-bg;
|
||||||
|
border-bottom: 1px solid darken($popover-title-bg, 5%);
|
||||||
|
border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popover-content {
|
||||||
|
padding: 9px 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Arrows
|
||||||
|
//
|
||||||
|
// .arrow is outer, .arrow:after is inner
|
||||||
|
|
||||||
|
.popover > .arrow {
|
||||||
|
&,
|
||||||
|
&:after {
|
||||||
|
position: absolute;
|
||||||
|
display: block;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-color: transparent;
|
||||||
|
border-style: solid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.popover > .arrow {
|
||||||
|
border-width: $popover-arrow-outer-width;
|
||||||
|
}
|
||||||
|
.popover > .arrow:after {
|
||||||
|
border-width: $popover-arrow-width;
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
|
||||||
|
.popover {
|
||||||
|
&.top > .arrow {
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -$popover-arrow-outer-width;
|
||||||
|
border-bottom-width: 0;
|
||||||
|
border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback
|
||||||
|
border-top-color: $popover-arrow-outer-color;
|
||||||
|
bottom: -$popover-arrow-outer-width;
|
||||||
|
&:after {
|
||||||
|
content: " ";
|
||||||
|
bottom: 1px;
|
||||||
|
margin-left: -$popover-arrow-width;
|
||||||
|
border-bottom-width: 0;
|
||||||
|
border-top-color: $popover-arrow-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.right > .arrow {
|
||||||
|
top: 50%;
|
||||||
|
left: -$popover-arrow-outer-width;
|
||||||
|
margin-top: -$popover-arrow-outer-width;
|
||||||
|
border-left-width: 0;
|
||||||
|
border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback
|
||||||
|
border-right-color: $popover-arrow-outer-color;
|
||||||
|
&:after {
|
||||||
|
content: " ";
|
||||||
|
left: 1px;
|
||||||
|
bottom: -$popover-arrow-width;
|
||||||
|
border-left-width: 0;
|
||||||
|
border-right-color: $popover-arrow-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.bottom > .arrow {
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -$popover-arrow-outer-width;
|
||||||
|
border-top-width: 0;
|
||||||
|
border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback
|
||||||
|
border-bottom-color: $popover-arrow-outer-color;
|
||||||
|
top: -$popover-arrow-outer-width;
|
||||||
|
&:after {
|
||||||
|
content: " ";
|
||||||
|
top: 1px;
|
||||||
|
margin-left: -$popover-arrow-width;
|
||||||
|
border-top-width: 0;
|
||||||
|
border-bottom-color: $popover-arrow-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.left > .arrow {
|
||||||
|
top: 50%;
|
||||||
|
right: -$popover-arrow-outer-width;
|
||||||
|
margin-top: -$popover-arrow-outer-width;
|
||||||
|
border-right-width: 0;
|
||||||
|
border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback
|
||||||
|
border-left-color: $popover-arrow-outer-color;
|
||||||
|
&:after {
|
||||||
|
content: " ";
|
||||||
|
right: 1px;
|
||||||
|
border-right-width: 0;
|
||||||
|
border-left-color: $popover-arrow-color;
|
||||||
|
bottom: -$popover-arrow-width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
|
||||||
|
|
||||||
|
// ==========================================================================
|
||||||
|
// Print styles.
|
||||||
|
// Inlined to avoid the additional HTTP request: h5bp.com/r
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
*,
|
||||||
|
*:before,
|
||||||
|
*:after {
|
||||||
|
background: transparent !important;
|
||||||
|
color: #000 !important; // Black prints faster: h5bp.com/s
|
||||||
|
box-shadow: none !important;
|
||||||
|
text-shadow: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
a,
|
||||||
|
a:visited {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
a[href]:after {
|
||||||
|
content: " (" attr(href) ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
abbr[title]:after {
|
||||||
|
content: " (" attr(title) ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't show links that are fragment identifiers,
|
||||||
|
// or use the `javascript:` pseudo protocol
|
||||||
|
a[href^="#"]:after,
|
||||||
|
a[href^="javascript:"]:after {
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
|
||||||
|
pre,
|
||||||
|
blockquote {
|
||||||
|
border: 1px solid #999;
|
||||||
|
page-break-inside: avoid;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead {
|
||||||
|
display: table-header-group; // h5bp.com/t
|
||||||
|
}
|
||||||
|
|
||||||
|
tr,
|
||||||
|
img {
|
||||||
|
page-break-inside: avoid;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
p,
|
||||||
|
h2,
|
||||||
|
h3 {
|
||||||
|
orphans: 3;
|
||||||
|
widows: 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2,
|
||||||
|
h3 {
|
||||||
|
page-break-after: avoid;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bootstrap specific changes start
|
||||||
|
|
||||||
|
// Bootstrap components
|
||||||
|
.navbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.btn,
|
||||||
|
.dropup > .btn {
|
||||||
|
> .caret {
|
||||||
|
border-top-color: #000 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.label {
|
||||||
|
border: 1px solid #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table {
|
||||||
|
border-collapse: collapse !important;
|
||||||
|
|
||||||
|
td,
|
||||||
|
th {
|
||||||
|
background-color: #fff !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.table-bordered {
|
||||||
|
th,
|
||||||
|
td {
|
||||||
|
border: 1px solid #ddd !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bootstrap specific changes end
|
||||||
|
}
|
|
@ -0,0 +1,87 @@
|
||||||
|
//
|
||||||
|
// Progress bars
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Bar animations
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
// WebKit
|
||||||
|
@-webkit-keyframes progress-bar-stripes {
|
||||||
|
from { background-position: 40px 0; }
|
||||||
|
to { background-position: 0 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spec and IE10+
|
||||||
|
@keyframes progress-bar-stripes {
|
||||||
|
from { background-position: 40px 0; }
|
||||||
|
to { background-position: 0 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Bar itself
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
// Outer container
|
||||||
|
.progress {
|
||||||
|
overflow: hidden;
|
||||||
|
height: $line-height-computed;
|
||||||
|
margin-bottom: $line-height-computed;
|
||||||
|
background-color: $progress-bg;
|
||||||
|
border-radius: $progress-border-radius;
|
||||||
|
@include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bar of progress
|
||||||
|
.progress-bar {
|
||||||
|
float: left;
|
||||||
|
width: 0%;
|
||||||
|
height: 100%;
|
||||||
|
font-size: $font-size-small;
|
||||||
|
line-height: $line-height-computed;
|
||||||
|
color: $progress-bar-color;
|
||||||
|
text-align: center;
|
||||||
|
background-color: $progress-bar-bg;
|
||||||
|
@include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
|
||||||
|
@include transition(width .6s ease);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Striped bars
|
||||||
|
//
|
||||||
|
// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the
|
||||||
|
// `.progress-bar-striped` class, which you just add to an existing
|
||||||
|
// `.progress-bar`.
|
||||||
|
.progress-striped .progress-bar,
|
||||||
|
.progress-bar-striped {
|
||||||
|
@include gradient-striped;
|
||||||
|
background-size: 40px 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call animation for the active one
|
||||||
|
//
|
||||||
|
// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the
|
||||||
|
// `.progress-bar.active` approach.
|
||||||
|
.progress.active .progress-bar,
|
||||||
|
.progress-bar.active {
|
||||||
|
@include animation(progress-bar-stripes 2s linear infinite);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Variations
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.progress-bar-success {
|
||||||
|
@include progress-bar-variant($progress-bar-success-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress-bar-info {
|
||||||
|
@include progress-bar-variant($progress-bar-info-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress-bar-warning {
|
||||||
|
@include progress-bar-variant($progress-bar-warning-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress-bar-danger {
|
||||||
|
@include progress-bar-variant($progress-bar-danger-bg);
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
// Embeds responsive
|
||||||
|
//
|
||||||
|
// Credit: Nicolas Gallagher and SUIT CSS.
|
||||||
|
|
||||||
|
.embed-responsive {
|
||||||
|
position: relative;
|
||||||
|
display: block;
|
||||||
|
height: 0;
|
||||||
|
padding: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.embed-responsive-item,
|
||||||
|
iframe,
|
||||||
|
embed,
|
||||||
|
object,
|
||||||
|
video {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modifier class for 16:9 aspect ratio
|
||||||
|
.embed-responsive-16by9 {
|
||||||
|
padding-bottom: 56.25%;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modifier class for 4:3 aspect ratio
|
||||||
|
.embed-responsive-4by3 {
|
||||||
|
padding-bottom: 75%;
|
||||||
|
}
|
|
@ -0,0 +1,179 @@
|
||||||
|
//
|
||||||
|
// Responsive: Utility classes
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// IE10 in Windows (Phone) 8
|
||||||
|
//
|
||||||
|
// Support for responsive views via media queries is kind of borked in IE10, for
|
||||||
|
// Surface/desktop in split view and for Windows Phone 8. This particular fix
|
||||||
|
// must be accompanied by a snippet of JavaScript to sniff the user agent and
|
||||||
|
// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at
|
||||||
|
// our Getting Started page for more information on this bug.
|
||||||
|
//
|
||||||
|
// For more information, see the following:
|
||||||
|
//
|
||||||
|
// Issue: https://github.com/twbs/bootstrap/issues/10497
|
||||||
|
// Docs: http://getbootstrap.com/getting-started/#support-ie10-width
|
||||||
|
// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/
|
||||||
|
// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
|
||||||
|
|
||||||
|
@at-root {
|
||||||
|
@-ms-viewport {
|
||||||
|
width: device-width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Visibility utilities
|
||||||
|
// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0
|
||||||
|
|
||||||
|
@include responsive-invisibility('.visible-xs');
|
||||||
|
@include responsive-invisibility('.visible-sm');
|
||||||
|
@include responsive-invisibility('.visible-md');
|
||||||
|
@include responsive-invisibility('.visible-lg');
|
||||||
|
|
||||||
|
.visible-xs-block,
|
||||||
|
.visible-xs-inline,
|
||||||
|
.visible-xs-inline-block,
|
||||||
|
.visible-sm-block,
|
||||||
|
.visible-sm-inline,
|
||||||
|
.visible-sm-inline-block,
|
||||||
|
.visible-md-block,
|
||||||
|
.visible-md-inline,
|
||||||
|
.visible-md-inline-block,
|
||||||
|
.visible-lg-block,
|
||||||
|
.visible-lg-inline,
|
||||||
|
.visible-lg-inline-block {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: $screen-xs-max) {
|
||||||
|
@include responsive-visibility('.visible-xs');
|
||||||
|
}
|
||||||
|
.visible-xs-block {
|
||||||
|
@media (max-width: $screen-xs-max) {
|
||||||
|
display: block !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.visible-xs-inline {
|
||||||
|
@media (max-width: $screen-xs-max) {
|
||||||
|
display: inline !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.visible-xs-inline-block {
|
||||||
|
@media (max-width: $screen-xs-max) {
|
||||||
|
display: inline-block !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
|
||||||
|
@include responsive-visibility('.visible-sm');
|
||||||
|
}
|
||||||
|
.visible-sm-block {
|
||||||
|
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
|
||||||
|
display: block !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.visible-sm-inline {
|
||||||
|
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
|
||||||
|
display: inline !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.visible-sm-inline-block {
|
||||||
|
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
|
||||||
|
display: inline-block !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
|
||||||
|
@include responsive-visibility('.visible-md');
|
||||||
|
}
|
||||||
|
.visible-md-block {
|
||||||
|
@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
|
||||||
|
display: block !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.visible-md-inline {
|
||||||
|
@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
|
||||||
|
display: inline !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.visible-md-inline-block {
|
||||||
|
@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
|
||||||
|
display: inline-block !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: $screen-lg-min) {
|
||||||
|
@include responsive-visibility('.visible-lg');
|
||||||
|
}
|
||||||
|
.visible-lg-block {
|
||||||
|
@media (min-width: $screen-lg-min) {
|
||||||
|
display: block !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.visible-lg-inline {
|
||||||
|
@media (min-width: $screen-lg-min) {
|
||||||
|
display: inline !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.visible-lg-inline-block {
|
||||||
|
@media (min-width: $screen-lg-min) {
|
||||||
|
display: inline-block !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: $screen-xs-max) {
|
||||||
|
@include responsive-invisibility('.hidden-xs');
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
|
||||||
|
@include responsive-invisibility('.hidden-sm');
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
|
||||||
|
@include responsive-invisibility('.hidden-md');
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: $screen-lg-min) {
|
||||||
|
@include responsive-invisibility('.hidden-lg');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Print utilities
|
||||||
|
//
|
||||||
|
// Media queries are placed on the inside to be mixin-friendly.
|
||||||
|
|
||||||
|
// Note: Deprecated .visible-print as of v3.2.0
|
||||||
|
|
||||||
|
@include responsive-invisibility('.visible-print');
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
@include responsive-visibility('.visible-print');
|
||||||
|
}
|
||||||
|
.visible-print-block {
|
||||||
|
display: none !important;
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
display: block !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.visible-print-inline {
|
||||||
|
display: none !important;
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
display: inline !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.visible-print-inline-block {
|
||||||
|
display: none !important;
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
display: inline-block !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
@include responsive-invisibility('.hidden-print');
|
||||||
|
}
|
|
@ -0,0 +1,161 @@
|
||||||
|
//
|
||||||
|
// Scaffolding
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Reset the box-sizing
|
||||||
|
//
|
||||||
|
// Heads up! This reset may cause conflicts with some third-party widgets.
|
||||||
|
// For recommendations on resolving such conflicts, see
|
||||||
|
// http://getbootstrap.com/getting-started/#third-box-sizing
|
||||||
|
* {
|
||||||
|
@include box-sizing(border-box);
|
||||||
|
}
|
||||||
|
*:before,
|
||||||
|
*:after {
|
||||||
|
@include box-sizing(border-box);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Body reset
|
||||||
|
|
||||||
|
html {
|
||||||
|
font-size: 10px;
|
||||||
|
-webkit-tap-highlight-color: rgba(0,0,0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: $font-family-base;
|
||||||
|
font-size: $font-size-base;
|
||||||
|
line-height: $line-height-base;
|
||||||
|
color: $text-color;
|
||||||
|
background-color: $body-bg;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset fonts for relevant elements
|
||||||
|
input,
|
||||||
|
button,
|
||||||
|
select,
|
||||||
|
textarea {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
line-height: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Links
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: $link-color;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: $link-hover-color;
|
||||||
|
text-decoration: $link-hover-decoration;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
@include tab-focus;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Figures
|
||||||
|
//
|
||||||
|
// We reset this here because previously Normalize had no `figure` margins. This
|
||||||
|
// ensures we don't break anyone's use of the element.
|
||||||
|
|
||||||
|
figure {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Images
|
||||||
|
|
||||||
|
img {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Responsive images (ensure images don't scale beyond their parents)
|
||||||
|
.img-responsive {
|
||||||
|
@include img-responsive;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rounded corners
|
||||||
|
.img-rounded {
|
||||||
|
border-radius: $border-radius-large;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Image thumbnails
|
||||||
|
//
|
||||||
|
// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
|
||||||
|
.img-thumbnail {
|
||||||
|
padding: $thumbnail-padding;
|
||||||
|
line-height: $line-height-base;
|
||||||
|
background-color: $thumbnail-bg;
|
||||||
|
border: 1px solid $thumbnail-border;
|
||||||
|
border-radius: $thumbnail-border-radius;
|
||||||
|
@include transition(all .2s ease-in-out);
|
||||||
|
|
||||||
|
// Keep them at most 100% wide
|
||||||
|
@include img-responsive(inline-block);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Perfect circle
|
||||||
|
.img-circle {
|
||||||
|
border-radius: 50%; // set radius in percents
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Horizontal rules
|
||||||
|
|
||||||
|
hr {
|
||||||
|
margin-top: $line-height-computed;
|
||||||
|
margin-bottom: $line-height-computed;
|
||||||
|
border: 0;
|
||||||
|
border-top: 1px solid $hr-border;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Only display content to screen readers
|
||||||
|
//
|
||||||
|
// See: http://a11yproject.com/posts/how-to-hide-content/
|
||||||
|
|
||||||
|
.sr-only {
|
||||||
|
position: absolute;
|
||||||
|
width: 1px;
|
||||||
|
height: 1px;
|
||||||
|
margin: -1px;
|
||||||
|
padding: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
clip: rect(0,0,0,0);
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use in conjunction with .sr-only to only display content when it's focused.
|
||||||
|
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
|
||||||
|
// Credit: HTML5 Boilerplate
|
||||||
|
|
||||||
|
.sr-only-focusable {
|
||||||
|
&:active,
|
||||||
|
&:focus {
|
||||||
|
position: static;
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
margin: 0;
|
||||||
|
overflow: visible;
|
||||||
|
clip: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// iOS "clickable elements" fix for role="button"
|
||||||
|
//
|
||||||
|
// Fixes "clickability" issue (and more generally, the firing of events such as focus as well)
|
||||||
|
// for traditionally non-focusable elements with role="button"
|
||||||
|
// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
|
||||||
|
|
||||||
|
[role="button"] {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
|
@ -0,0 +1,234 @@
|
||||||
|
//
|
||||||
|
// Tables
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
table {
|
||||||
|
background-color: $table-bg;
|
||||||
|
}
|
||||||
|
caption {
|
||||||
|
padding-top: $table-cell-padding;
|
||||||
|
padding-bottom: $table-cell-padding;
|
||||||
|
color: $text-muted;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
th {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Baseline styles
|
||||||
|
|
||||||
|
.table {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
margin-bottom: $line-height-computed;
|
||||||
|
// Cells
|
||||||
|
> thead,
|
||||||
|
> tbody,
|
||||||
|
> tfoot {
|
||||||
|
> tr {
|
||||||
|
> th,
|
||||||
|
> td {
|
||||||
|
padding: $table-cell-padding;
|
||||||
|
line-height: $line-height-base;
|
||||||
|
vertical-align: top;
|
||||||
|
border-top: 1px solid $table-border-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Bottom align for column headings
|
||||||
|
> thead > tr > th {
|
||||||
|
vertical-align: bottom;
|
||||||
|
border-bottom: 2px solid $table-border-color;
|
||||||
|
}
|
||||||
|
// Remove top border from thead by default
|
||||||
|
> caption + thead,
|
||||||
|
> colgroup + thead,
|
||||||
|
> thead:first-child {
|
||||||
|
> tr:first-child {
|
||||||
|
> th,
|
||||||
|
> td {
|
||||||
|
border-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Account for multiple tbody instances
|
||||||
|
> tbody + tbody {
|
||||||
|
border-top: 2px solid $table-border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nesting
|
||||||
|
.table {
|
||||||
|
background-color: $body-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Condensed table w/ half padding
|
||||||
|
|
||||||
|
.table-condensed {
|
||||||
|
> thead,
|
||||||
|
> tbody,
|
||||||
|
> tfoot {
|
||||||
|
> tr {
|
||||||
|
> th,
|
||||||
|
> td {
|
||||||
|
padding: $table-condensed-cell-padding;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Bordered version
|
||||||
|
//
|
||||||
|
// Add borders all around the table and between all the columns.
|
||||||
|
|
||||||
|
.table-bordered {
|
||||||
|
border: 1px solid $table-border-color;
|
||||||
|
> thead,
|
||||||
|
> tbody,
|
||||||
|
> tfoot {
|
||||||
|
> tr {
|
||||||
|
> th,
|
||||||
|
> td {
|
||||||
|
border: 1px solid $table-border-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> thead > tr {
|
||||||
|
> th,
|
||||||
|
> td {
|
||||||
|
border-bottom-width: 2px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Zebra-striping
|
||||||
|
//
|
||||||
|
// Default zebra-stripe styles (alternating gray and transparent backgrounds)
|
||||||
|
|
||||||
|
.table-striped {
|
||||||
|
> tbody > tr:nth-of-type(odd) {
|
||||||
|
background-color: $table-bg-accent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Hover effect
|
||||||
|
//
|
||||||
|
// Placed here since it has to come after the potential zebra striping
|
||||||
|
|
||||||
|
.table-hover {
|
||||||
|
> tbody > tr:hover {
|
||||||
|
background-color: $table-bg-hover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Table cell sizing
|
||||||
|
//
|
||||||
|
// Reset default table behavior
|
||||||
|
|
||||||
|
table col[class*="col-"] {
|
||||||
|
position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
|
||||||
|
float: none;
|
||||||
|
display: table-column;
|
||||||
|
}
|
||||||
|
table {
|
||||||
|
td,
|
||||||
|
th {
|
||||||
|
&[class*="col-"] {
|
||||||
|
position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
|
||||||
|
float: none;
|
||||||
|
display: table-cell;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Table backgrounds
|
||||||
|
//
|
||||||
|
// Exact selectors below required to override `.table-striped` and prevent
|
||||||
|
// inheritance to nested tables.
|
||||||
|
|
||||||
|
// Generate the contextual variants
|
||||||
|
@include table-row-variant('active', $table-bg-active);
|
||||||
|
@include table-row-variant('success', $state-success-bg);
|
||||||
|
@include table-row-variant('info', $state-info-bg);
|
||||||
|
@include table-row-variant('warning', $state-warning-bg);
|
||||||
|
@include table-row-variant('danger', $state-danger-bg);
|
||||||
|
|
||||||
|
|
||||||
|
// 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
|
||||||
|
// will display normally.
|
||||||
|
|
||||||
|
.table-responsive {
|
||||||
|
overflow-x: auto;
|
||||||
|
min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)
|
||||||
|
|
||||||
|
@media screen and (max-width: $screen-xs-max) {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: ($line-height-computed * 0.75);
|
||||||
|
overflow-y: hidden;
|
||||||
|
-ms-overflow-style: -ms-autohiding-scrollbar;
|
||||||
|
border: 1px solid $table-border-color;
|
||||||
|
|
||||||
|
// Tighten up spacing
|
||||||
|
> .table {
|
||||||
|
margin-bottom: 0;
|
||||||
|
|
||||||
|
// Ensure the content doesn't wrap
|
||||||
|
> thead,
|
||||||
|
> tbody,
|
||||||
|
> tfoot {
|
||||||
|
> tr {
|
||||||
|
> th,
|
||||||
|
> td {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Special overrides for the bordered tables
|
||||||
|
> .table-bordered {
|
||||||
|
border: 0;
|
||||||
|
|
||||||
|
// Nuke the appropriate borders so that the parent can handle them
|
||||||
|
> thead,
|
||||||
|
> tbody,
|
||||||
|
> tfoot {
|
||||||
|
> tr {
|
||||||
|
> th:first-child,
|
||||||
|
> td:first-child {
|
||||||
|
border-left: 0;
|
||||||
|
}
|
||||||
|
> th:last-child,
|
||||||
|
> td:last-child {
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only nuke the last row's bottom-border in `tbody` and `tfoot` since
|
||||||
|
// chances are there will be only one `tr` in a `thead` and that would
|
||||||
|
// remove the border altogether.
|
||||||
|
> tbody,
|
||||||
|
> tfoot {
|
||||||
|
> tr:last-child {
|
||||||
|
> th,
|
||||||
|
> td {
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,291 @@
|
||||||
|
/*!
|
||||||
|
* Bootstrap v3.3.6 (http://getbootstrap.com)
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Load core variables and mixins
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
@import "variables";
|
||||||
|
@import "mixins";
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Buttons
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// Common styles
|
||||||
|
.btn-default,
|
||||||
|
.btn-primary,
|
||||||
|
.btn-success,
|
||||||
|
.btn-info,
|
||||||
|
.btn-warning,
|
||||||
|
.btn-danger {
|
||||||
|
text-shadow: 0 -1px 0 rgba(0,0,0,.2);
|
||||||
|
$shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);
|
||||||
|
@include box-shadow($shadow);
|
||||||
|
|
||||||
|
// Reset the shadow
|
||||||
|
&:active,
|
||||||
|
&.active {
|
||||||
|
@include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled,
|
||||||
|
&[disabled],
|
||||||
|
fieldset[disabled] & {
|
||||||
|
@include box-shadow(none);
|
||||||
|
}
|
||||||
|
|
||||||
|
.badge {
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mixin for generating new styles
|
||||||
|
@mixin btn-styles($btn-color: #555) {
|
||||||
|
@include gradient-vertical($start-color: $btn-color, $end-color: darken($btn-color, 12%));
|
||||||
|
@include reset-filter; // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: darken($btn-color, 14%);
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
background-color: darken($btn-color, 12%);
|
||||||
|
background-position: 0 -15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active,
|
||||||
|
&.active {
|
||||||
|
background-color: darken($btn-color, 12%);
|
||||||
|
border-color: darken($btn-color, 14%);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled,
|
||||||
|
&[disabled],
|
||||||
|
fieldset[disabled] & {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus,
|
||||||
|
&.focus,
|
||||||
|
&:active,
|
||||||
|
&.active {
|
||||||
|
background-color: darken($btn-color, 12%);
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Common styles
|
||||||
|
.btn {
|
||||||
|
// Remove the gradient for the pressed/active state
|
||||||
|
&:active,
|
||||||
|
&.active {
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply the mixin to the buttons
|
||||||
|
.btn-default { @include btn-styles($btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }
|
||||||
|
.btn-primary { @include btn-styles($btn-primary-bg); }
|
||||||
|
.btn-success { @include btn-styles($btn-success-bg); }
|
||||||
|
.btn-info { @include btn-styles($btn-info-bg); }
|
||||||
|
.btn-warning { @include btn-styles($btn-warning-bg); }
|
||||||
|
.btn-danger { @include btn-styles($btn-danger-bg); }
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Images
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
.thumbnail,
|
||||||
|
.img-thumbnail {
|
||||||
|
@include box-shadow(0 1px 2px rgba(0,0,0,.075));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Dropdowns
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
.dropdown-menu > li > a:hover,
|
||||||
|
.dropdown-menu > li > a:focus {
|
||||||
|
@include gradient-vertical($start-color: $dropdown-link-hover-bg, $end-color: darken($dropdown-link-hover-bg, 5%));
|
||||||
|
background-color: darken($dropdown-link-hover-bg, 5%);
|
||||||
|
}
|
||||||
|
.dropdown-menu > .active > a,
|
||||||
|
.dropdown-menu > .active > a:hover,
|
||||||
|
.dropdown-menu > .active > a:focus {
|
||||||
|
@include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%));
|
||||||
|
background-color: darken($dropdown-link-active-bg, 5%);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Navbar
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// Default navbar
|
||||||
|
.navbar-default {
|
||||||
|
@include gradient-vertical($start-color: lighten($navbar-default-bg, 10%), $end-color: $navbar-default-bg);
|
||||||
|
@include reset-filter; // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
|
||||||
|
border-radius: $navbar-border-radius;
|
||||||
|
$shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);
|
||||||
|
@include box-shadow($shadow);
|
||||||
|
|
||||||
|
.navbar-nav > .open > a,
|
||||||
|
.navbar-nav > .active > a {
|
||||||
|
@include gradient-vertical($start-color: darken($navbar-default-link-active-bg, 5%), $end-color: darken($navbar-default-link-active-bg, 2%));
|
||||||
|
@include box-shadow(inset 0 3px 9px rgba(0,0,0,.075));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.navbar-brand,
|
||||||
|
.navbar-nav > li > a {
|
||||||
|
text-shadow: 0 1px 0 rgba(255,255,255,.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inverted navbar
|
||||||
|
.navbar-inverse {
|
||||||
|
@include gradient-vertical($start-color: lighten($navbar-inverse-bg, 10%), $end-color: $navbar-inverse-bg);
|
||||||
|
@include reset-filter; // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257
|
||||||
|
border-radius: $navbar-border-radius;
|
||||||
|
.navbar-nav > .open > a,
|
||||||
|
.navbar-nav > .active > a {
|
||||||
|
@include gradient-vertical($start-color: $navbar-inverse-link-active-bg, $end-color: lighten($navbar-inverse-link-active-bg, 2.5%));
|
||||||
|
@include box-shadow(inset 0 3px 9px rgba(0,0,0,.25));
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-brand,
|
||||||
|
.navbar-nav > li > a {
|
||||||
|
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Undo rounded corners in static and fixed navbars
|
||||||
|
.navbar-static-top,
|
||||||
|
.navbar-fixed-top,
|
||||||
|
.navbar-fixed-bottom {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fix active state of dropdown items in collapsed mode
|
||||||
|
@media (max-width: $grid-float-breakpoint-max) {
|
||||||
|
.navbar .navbar-nav .open .dropdown-menu > .active > a {
|
||||||
|
&,
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
color: #fff;
|
||||||
|
@include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Alerts
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// Common styles
|
||||||
|
.alert {
|
||||||
|
text-shadow: 0 1px 0 rgba(255,255,255,.2);
|
||||||
|
$shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);
|
||||||
|
@include box-shadow($shadow);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mixin for generating new styles
|
||||||
|
@mixin alert-styles($color) {
|
||||||
|
@include gradient-vertical($start-color: $color, $end-color: darken($color, 7.5%));
|
||||||
|
border-color: darken($color, 15%);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply the mixin to the alerts
|
||||||
|
.alert-success { @include alert-styles($alert-success-bg); }
|
||||||
|
.alert-info { @include alert-styles($alert-info-bg); }
|
||||||
|
.alert-warning { @include alert-styles($alert-warning-bg); }
|
||||||
|
.alert-danger { @include alert-styles($alert-danger-bg); }
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Progress bars
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// Give the progress background some depth
|
||||||
|
.progress {
|
||||||
|
@include gradient-vertical($start-color: darken($progress-bg, 4%), $end-color: $progress-bg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mixin for generating new styles
|
||||||
|
@mixin progress-bar-styles($color) {
|
||||||
|
@include gradient-vertical($start-color: $color, $end-color: darken($color, 10%));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply the mixin to the progress bars
|
||||||
|
.progress-bar { @include progress-bar-styles($progress-bar-bg); }
|
||||||
|
.progress-bar-success { @include progress-bar-styles($progress-bar-success-bg); }
|
||||||
|
.progress-bar-info { @include progress-bar-styles($progress-bar-info-bg); }
|
||||||
|
.progress-bar-warning { @include progress-bar-styles($progress-bar-warning-bg); }
|
||||||
|
.progress-bar-danger { @include progress-bar-styles($progress-bar-danger-bg); }
|
||||||
|
|
||||||
|
// Reset the striped class because our mixins don't do multiple gradients and
|
||||||
|
// the above custom styles override the new `.progress-bar-striped` in v3.2.0.
|
||||||
|
.progress-bar-striped {
|
||||||
|
@include gradient-striped;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// List groups
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
.list-group {
|
||||||
|
border-radius: $border-radius-base;
|
||||||
|
@include box-shadow(0 1px 2px rgba(0,0,0,.075));
|
||||||
|
}
|
||||||
|
.list-group-item.active,
|
||||||
|
.list-group-item.active:hover,
|
||||||
|
.list-group-item.active:focus {
|
||||||
|
text-shadow: 0 -1px 0 darken($list-group-active-bg, 10%);
|
||||||
|
@include gradient-vertical($start-color: $list-group-active-bg, $end-color: darken($list-group-active-bg, 7.5%));
|
||||||
|
border-color: darken($list-group-active-border, 7.5%);
|
||||||
|
|
||||||
|
.badge {
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Panels
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// Common styles
|
||||||
|
.panel {
|
||||||
|
@include box-shadow(0 1px 2px rgba(0,0,0,.05));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mixin for generating new styles
|
||||||
|
@mixin panel-heading-styles($color) {
|
||||||
|
@include gradient-vertical($start-color: $color, $end-color: darken($color, 5%));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply the mixin to the panel headings only
|
||||||
|
.panel-default > .panel-heading { @include panel-heading-styles($panel-default-heading-bg); }
|
||||||
|
.panel-primary > .panel-heading { @include panel-heading-styles($panel-primary-heading-bg); }
|
||||||
|
.panel-success > .panel-heading { @include panel-heading-styles($panel-success-heading-bg); }
|
||||||
|
.panel-info > .panel-heading { @include panel-heading-styles($panel-info-heading-bg); }
|
||||||
|
.panel-warning > .panel-heading { @include panel-heading-styles($panel-warning-heading-bg); }
|
||||||
|
.panel-danger > .panel-heading { @include panel-heading-styles($panel-danger-heading-bg); }
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Wells
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
.well {
|
||||||
|
@include gradient-vertical($start-color: darken($well-bg, 5%), $end-color: $well-bg);
|
||||||
|
border-color: darken($well-bg, 10%);
|
||||||
|
$shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);
|
||||||
|
@include box-shadow($shadow);
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue