| @@ -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,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,304 @@ | ||
| { | ||
| "always-semicolon": true, | ||
| "block-indent": 2, | ||
| "color-case": "lower", | ||
| "color-shorthand": true, | ||
| "element-case": "lower", | ||
| "eof-newline": true, | ||
| "leading-zero": false, | ||
| "remove-empty-rulesets": true, | ||
| "space-after-colon": 1, | ||
| "space-after-combinator": 1, | ||
| "space-before-selector-delimiter": 0, | ||
| "space-between-declarations": "\n", | ||
| "space-after-opening-brace": "\n", | ||
| "space-before-closing-brace": "\n", | ||
| "space-before-colon": 0, | ||
| "space-before-combinator": 1, | ||
| "space-before-opening-brace": 1, | ||
| "strip-spaces": true, | ||
| "unitless-zero": true, | ||
| "vendor-prefix-align": true, | ||
| "sort-order": [ | ||
| [ | ||
| "position", | ||
| "top", | ||
| "right", | ||
| "bottom", | ||
| "left", | ||
| "z-index", | ||
| "display", | ||
| "float", | ||
| "width", | ||
| "min-width", | ||
| "max-width", | ||
| "height", | ||
| "min-height", | ||
| "max-height", | ||
| "-webkit-box-sizing", | ||
| "-moz-box-sizing", | ||
| "box-sizing", | ||
| "-webkit-appearance", | ||
| "padding", | ||
| "padding-top", | ||
| "padding-right", | ||
| "padding-bottom", | ||
| "padding-left", | ||
| "margin", | ||
| "margin-top", | ||
| "margin-right", | ||
| "margin-bottom", | ||
| "margin-left", | ||
| "overflow", | ||
| "overflow-x", | ||
| "overflow-y", | ||
| "-webkit-overflow-scrolling", | ||
| "-ms-overflow-x", | ||
| "-ms-overflow-y", | ||
| "-ms-overflow-style", | ||
| "clip", | ||
| "clear", | ||
| "font", | ||
| "font-family", | ||
| "font-size", | ||
| "font-style", | ||
| "font-weight", | ||
| "font-variant", | ||
| "font-size-adjust", | ||
| "font-stretch", | ||
| "font-effect", | ||
| "font-emphasize", | ||
| "font-emphasize-position", | ||
| "font-emphasize-style", | ||
| "font-smooth", | ||
| "-webkit-hyphens", | ||
| "-moz-hyphens", | ||
| "hyphens", | ||
| "line-height", | ||
| "color", | ||
| "text-align", | ||
| "-webkit-text-align-last", | ||
| "-moz-text-align-last", | ||
| "-ms-text-align-last", | ||
| "text-align-last", | ||
| "text-emphasis", | ||
| "text-emphasis-color", | ||
| "text-emphasis-style", | ||
| "text-emphasis-position", | ||
| "text-decoration", | ||
| "text-indent", | ||
| "text-justify", | ||
| "text-outline", | ||
| "-ms-text-overflow", | ||
| "text-overflow", | ||
| "text-overflow-ellipsis", | ||
| "text-overflow-mode", | ||
| "text-shadow", | ||
| "text-transform", | ||
| "text-wrap", | ||
| "-webkit-text-size-adjust", | ||
| "-ms-text-size-adjust", | ||
| "letter-spacing", | ||
| "-ms-word-break", | ||
| "word-break", | ||
| "word-spacing", | ||
| "-ms-word-wrap", | ||
| "word-wrap", | ||
| "-moz-tab-size", | ||
| "-o-tab-size", | ||
| "tab-size", | ||
| "white-space", | ||
| "vertical-align", | ||
| "list-style", | ||
| "list-style-position", | ||
| "list-style-type", | ||
| "list-style-image", | ||
| "pointer-events", | ||
| "-ms-touch-action", | ||
| "touch-action", | ||
| "cursor", | ||
| "visibility", | ||
| "zoom", | ||
| "flex-direction", | ||
| "flex-order", | ||
| "flex-pack", | ||
| "flex-align", | ||
| "table-layout", | ||
| "empty-cells", | ||
| "caption-side", | ||
| "border-spacing", | ||
| "border-collapse", | ||
| "content", | ||
| "quotes", | ||
| "counter-reset", | ||
| "counter-increment", | ||
| "resize", | ||
| "-webkit-user-select", | ||
| "-moz-user-select", | ||
| "-ms-user-select", | ||
| "-o-user-select", | ||
| "user-select", | ||
| "nav-index", | ||
| "nav-up", | ||
| "nav-right", | ||
| "nav-down", | ||
| "nav-left", | ||
| "background", | ||
| "background-color", | ||
| "background-image", | ||
| "-ms-filter:\\'progid:DXImageTransform.Microsoft.gradient", | ||
| "filter:progid:DXImageTransform.Microsoft.gradient", | ||
| "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader", | ||
| "filter", | ||
| "background-repeat", | ||
| "background-attachment", | ||
| "background-position", | ||
| "background-position-x", | ||
| "background-position-y", | ||
| "-webkit-background-clip", | ||
| "-moz-background-clip", | ||
| "background-clip", | ||
| "background-origin", | ||
| "-webkit-background-size", | ||
| "-moz-background-size", | ||
| "-o-background-size", | ||
| "background-size", | ||
| "border", | ||
| "border-color", | ||
| "border-style", | ||
| "border-width", | ||
| "border-top", | ||
| "border-top-color", | ||
| "border-top-style", | ||
| "border-top-width", | ||
| "border-right", | ||
| "border-right-color", | ||
| "border-right-style", | ||
| "border-right-width", | ||
| "border-bottom", | ||
| "border-bottom-color", | ||
| "border-bottom-style", | ||
| "border-bottom-width", | ||
| "border-left", | ||
| "border-left-color", | ||
| "border-left-style", | ||
| "border-left-width", | ||
| "border-radius", | ||
| "border-top-left-radius", | ||
| "border-top-right-radius", | ||
| "border-bottom-right-radius", | ||
| "border-bottom-left-radius", | ||
| "-webkit-border-image", | ||
| "-moz-border-image", | ||
| "-o-border-image", | ||
| "border-image", | ||
| "-webkit-border-image-source", | ||
| "-moz-border-image-source", | ||
| "-o-border-image-source", | ||
| "border-image-source", | ||
| "-webkit-border-image-slice", | ||
| "-moz-border-image-slice", | ||
| "-o-border-image-slice", | ||
| "border-image-slice", | ||
| "-webkit-border-image-width", | ||
| "-moz-border-image-width", | ||
| "-o-border-image-width", | ||
| "border-image-width", | ||
| "-webkit-border-image-outset", | ||
| "-moz-border-image-outset", | ||
| "-o-border-image-outset", | ||
| "border-image-outset", | ||
| "-webkit-border-image-repeat", | ||
| "-moz-border-image-repeat", | ||
| "-o-border-image-repeat", | ||
| "border-image-repeat", | ||
| "outline", | ||
| "outline-width", | ||
| "outline-style", | ||
| "outline-color", | ||
| "outline-offset", | ||
| "-webkit-box-shadow", | ||
| "-moz-box-shadow", | ||
| "box-shadow", | ||
| "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity", | ||
| "-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha", | ||
| "opacity", | ||
| "-ms-interpolation-mode", | ||
| "-webkit-transition", | ||
| "-moz-transition", | ||
| "-ms-transition", | ||
| "-o-transition", | ||
| "transition", | ||
| "-webkit-transition-delay", | ||
| "-moz-transition-delay", | ||
| "-ms-transition-delay", | ||
| "-o-transition-delay", | ||
| "transition-delay", | ||
| "-webkit-transition-timing-function", | ||
| "-moz-transition-timing-function", | ||
| "-ms-transition-timing-function", | ||
| "-o-transition-timing-function", | ||
| "transition-timing-function", | ||
| "-webkit-transition-duration", | ||
| "-moz-transition-duration", | ||
| "-ms-transition-duration", | ||
| "-o-transition-duration", | ||
| "transition-duration", | ||
| "-webkit-transition-property", | ||
| "-moz-transition-property", | ||
| "-ms-transition-property", | ||
| "-o-transition-property", | ||
| "transition-property", | ||
| "-webkit-transform", | ||
| "-moz-transform", | ||
| "-ms-transform", | ||
| "-o-transform", | ||
| "transform", | ||
| "-webkit-transform-origin", | ||
| "-moz-transform-origin", | ||
| "-ms-transform-origin", | ||
| "-o-transform-origin", | ||
| "transform-origin", | ||
| "-webkit-animation", | ||
| "-moz-animation", | ||
| "-ms-animation", | ||
| "-o-animation", | ||
| "animation", | ||
| "-webkit-animation-name", | ||
| "-moz-animation-name", | ||
| "-ms-animation-name", | ||
| "-o-animation-name", | ||
| "animation-name", | ||
| "-webkit-animation-duration", | ||
| "-moz-animation-duration", | ||
| "-ms-animation-duration", | ||
| "-o-animation-duration", | ||
| "animation-duration", | ||
| "-webkit-animation-play-state", | ||
| "-moz-animation-play-state", | ||
| "-ms-animation-play-state", | ||
| "-o-animation-play-state", | ||
| "animation-play-state", | ||
| "-webkit-animation-timing-function", | ||
| "-moz-animation-timing-function", | ||
| "-ms-animation-timing-function", | ||
| "-o-animation-timing-function", | ||
| "animation-timing-function", | ||
| "-webkit-animation-delay", | ||
| "-moz-animation-delay", | ||
| "-ms-animation-delay", | ||
| "-o-animation-delay", | ||
| "animation-delay", | ||
| "-webkit-animation-iteration-count", | ||
| "-moz-animation-iteration-count", | ||
| "-ms-animation-iteration-count", | ||
| "-o-animation-iteration-count", | ||
| "animation-iteration-count", | ||
| "-webkit-animation-direction", | ||
| "-moz-animation-direction", | ||
| "-ms-animation-direction", | ||
| "-o-animation-direction", | ||
| "animation-direction" | ||
| ] | ||
| ] | ||
| } |
| @@ -0,0 +1,19 @@ | ||
| { | ||
| "adjoining-classes": false, | ||
| "box-sizing": false, | ||
| "box-model": false, | ||
| "compatible-vendor-prefixes": false, | ||
| "floats": false, | ||
| "font-sizes": false, | ||
| "gradients": false, | ||
| "important": false, | ||
| "known-properties": false, | ||
| "outline-none": false, | ||
| "qualified-headings": false, | ||
| "regex-selectors": false, | ||
| "shorthand": false, | ||
| "text-indent": false, | ||
| "unique-headings": false, | ||
| "universal-selector": false, | ||
| "unqualified-attributes": false | ||
| } |
| @@ -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 { | ||
| .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); | ||
| } | ||
|
|
||
| .alert-info { | ||
| .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); | ||
| } | ||
|
|
||
| .alert-warning { | ||
| .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); | ||
| } | ||
|
|
||
| .alert-danger { | ||
| .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); | ||
| } |
| @@ -0,0 +1,66 @@ | ||
| // | ||
| // 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; | ||
| } | ||
|
|
||
| // Hover state, but only for links | ||
| a& { | ||
| &:hover, | ||
| &:focus { | ||
| color: @badge-link-hover-color; | ||
| text-decoration: none; | ||
| cursor: pointer; | ||
| } | ||
| } | ||
|
|
||
| // 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; | ||
| } | ||
| } |
| @@ -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 "variables.less"; | ||
| @import "mixins.less"; | ||
|
|
||
| // Reset and dependencies | ||
| @import "normalize.less"; | ||
| @import "print.less"; | ||
| @import "glyphicons.less"; | ||
|
|
||
| // Core CSS | ||
| @import "scaffolding.less"; | ||
| @import "type.less"; | ||
| @import "code.less"; | ||
| @import "grid.less"; | ||
| @import "tables.less"; | ||
| @import "forms.less"; | ||
| @import "buttons.less"; | ||
|
|
||
| // Components | ||
| @import "component-animations.less"; | ||
| @import "dropdowns.less"; | ||
| @import "button-groups.less"; | ||
| @import "input-groups.less"; | ||
| @import "navs.less"; | ||
| @import "navbar.less"; | ||
| @import "breadcrumbs.less"; | ||
| @import "pagination.less"; | ||
| @import "pager.less"; | ||
| @import "labels.less"; | ||
| @import "badges.less"; | ||
| @import "jumbotron.less"; | ||
| @import "thumbnails.less"; | ||
| @import "alerts.less"; | ||
| @import "progress-bars.less"; | ||
| @import "media.less"; | ||
| @import "list-group.less"; | ||
| @import "panels.less"; | ||
| @import "responsive-embed.less"; | ||
| @import "wells.less"; | ||
| @import "close.less"; | ||
|
|
||
| // Components w/ JavaScript | ||
| @import "modals.less"; | ||
| @import "tooltip.less"; | ||
| @import "popovers.less"; | ||
| @import "carousel.less"; | ||
|
|
||
| // Utility classes | ||
| @import "utilities.less"; | ||
| @import "responsive-utilities.less"; |
| @@ -0,0 +1,26 @@ | ||
| // | ||
| // 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 { | ||
| content: "@{breadcrumb-separator}\00a0"; // 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 | ||
| &:extend(.clearfix all); | ||
|
|
||
| .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) { | ||
| .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) { | ||
| .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 { | ||
| .border-right-radius(0); | ||
| } | ||
| } | ||
| .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { | ||
| .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 { | ||
| .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 { | ||
| .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 { | ||
| &:extend(.clearfix all); | ||
| > .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) { | ||
| .border-top-radius(@btn-border-radius-base); | ||
| .border-bottom-radius(0); | ||
| } | ||
| &:last-child:not(:first-child) { | ||
| .border-top-radius(0); | ||
| .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 { | ||
| .border-bottom-radius(0); | ||
| } | ||
| } | ||
| .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { | ||
| .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,166 @@ | ||
| // | ||
| // 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; | ||
| .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base); | ||
| .user-select(none); | ||
|
|
||
| &, | ||
| &:active, | ||
| &.active { | ||
| &:focus, | ||
| &.focus { | ||
| .tab-focus(); | ||
| } | ||
| } | ||
|
|
||
| &:hover, | ||
| &:focus, | ||
| &.focus { | ||
| color: @btn-default-color; | ||
| text-decoration: none; | ||
| } | ||
|
|
||
| &:active, | ||
| &.active { | ||
| outline: 0; | ||
| background-image: none; | ||
| .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); | ||
| } | ||
|
|
||
| &.disabled, | ||
| &[disabled], | ||
| fieldset[disabled] & { | ||
| cursor: @cursor-disabled; | ||
| .opacity(.65); | ||
| .box-shadow(none); | ||
| } | ||
|
|
||
| a& { | ||
| &.disabled, | ||
| fieldset[disabled] & { | ||
| pointer-events: none; // Future-proof disabling of clicks on `<a>` elements | ||
| } | ||
| } | ||
| } | ||
|
|
||
|
|
||
| // Alternate buttons | ||
| // -------------------------------------------------- | ||
|
|
||
| .btn-default { | ||
| .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border); | ||
| } | ||
| .btn-primary { | ||
| .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border); | ||
| } | ||
| // Success appears as green | ||
| .btn-success { | ||
| .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border); | ||
| } | ||
| // Info appears as blue-green | ||
| .btn-info { | ||
| .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border); | ||
| } | ||
| // Warning appears as orange | ||
| .btn-warning { | ||
| .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border); | ||
| } | ||
| // Danger and error appear as red | ||
| .btn-danger { | ||
| .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; | ||
| .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 | ||
| .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 | ||
| .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small); | ||
| } | ||
| .btn-xs { | ||
| .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; | ||
| .transition(.6s ease-in-out left); | ||
|
|
||
| // Account for jankitude on images | ||
| > img, | ||
| > a > img { | ||
| &:extend(.img-responsive); | ||
| line-height: 1; | ||
| } | ||
|
|
||
| // WebKit CSS3 transforms for supported devices | ||
| @media all and (transform-3d), (-webkit-transform-3d) { | ||
| .transition-transform(~'0.6s ease-in-out'); | ||
| .backface-visibility(~'hidden'); | ||
| .perspective(1000px); | ||
|
|
||
| &.next, | ||
| &.active.right { | ||
| .translate3d(100%, 0, 0); | ||
| left: 0; | ||
| } | ||
| &.prev, | ||
| &.active.left { | ||
| .translate3d(-100%, 0, 0); | ||
| left: 0; | ||
| } | ||
| &.next.left, | ||
| &.prev.right, | ||
| &.active { | ||
| .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; | ||
| .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 { | ||
| #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001)); | ||
| } | ||
| &.right { | ||
| left: auto; | ||
| right: 0; | ||
| #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; | ||
| .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,34 @@ | ||
| // | ||
| // 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; | ||
| .opacity(.2); | ||
|
|
||
| &:hover, | ||
| &:focus { | ||
| color: @close-color; | ||
| text-decoration: none; | ||
| cursor: pointer; | ||
| .opacity(.5); | ||
| } | ||
|
|
||
| // 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& { | ||
| 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,33 @@ | ||
| // | ||
| // 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; | ||
| .transition(opacity .15s linear); | ||
| &.in { | ||
| opacity: 1; | ||
| } | ||
| } | ||
|
|
||
| .collapse { | ||
| display: none; | ||
|
|
||
| &.in { display: block; } | ||
| tr&.in { display: table-row; } | ||
| tbody&.in { display: table-row-group; } | ||
| } | ||
|
|
||
| .collapsing { | ||
| position: relative; | ||
| height: 0; | ||
| overflow: hidden; | ||
| .transition-property(~"height, visibility"); | ||
| .transition-duration(.35s); | ||
| .transition-timing-function(ease); | ||
| } |