http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/scrollspy.js ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/scrollspy.js b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/scrollspy.js index db23787..c468262 100644 --- a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/scrollspy.js +++ b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/scrollspy.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: scrollspy.js v3.2.0 + * Bootstrap: scrollspy.js v3.3.1 * http://getbootstrap.com/javascript/#scrollspy * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -30,7 +30,7 @@ this.process() } - ScrollSpy.VERSION = '3.2.0' + ScrollSpy.VERSION = '3.3.1' ScrollSpy.DEFAULTS = { offset: 10 @@ -91,8 +91,9 @@ return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) } - if (activeTarget && scrollTop <= offsets[0]) { - return activeTarget != (i = targets[0]) && this.activate(i) + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() } for (i = offsets.length; i--;) { @@ -106,9 +107,7 @@ ScrollSpy.prototype.activate = function (target) { this.activeTarget = target - $(this.selector) - .parentsUntil(this.options.target, '.active') - .removeClass('active') + this.clear() var selector = this.selector + '[data-target="' + target + '"],' + @@ -127,6 +126,12 @@ active.trigger('activate.bs.scrollspy') } + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + // SCROLLSPY PLUGIN DEFINITION // ===========================
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/tab.js ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/tab.js b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/tab.js index c0e1e46..d59827f 100644 --- a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/tab.js +++ b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/tab.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: tab.js v3.2.0 + * Bootstrap: tab.js v3.3.1 * http://getbootstrap.com/javascript/#tabs * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -17,7 +17,9 @@ this.element = $(element) } - Tab.VERSION = '3.2.0' + Tab.VERSION = '3.3.1' + + Tab.TRANSITION_DURATION = 150 Tab.prototype.show = function () { var $this = this.element @@ -31,22 +33,30 @@ if ($this.parent('li').hasClass('active')) return - var previous = $ul.find('.active:last a')[0] - var e = $.Event('show.bs.tab', { - relatedTarget: previous + 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] }) - $this.trigger(e) + $previous.trigger(hideEvent) + $this.trigger(showEvent) - if (e.isDefaultPrevented()) return + 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 + relatedTarget: $previous[0] }) }) } @@ -55,15 +65,21 @@ var $active = container.find('> .active') var transition = callback && $.support.transition - && $active.hasClass('fade') + && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length) function next() { $active .removeClass('active') .find('> .dropdown-menu > .active') - .removeClass('active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) - element.addClass('active') + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) if (transition) { element[0].offsetWidth // reflow for transition @@ -73,16 +89,21 @@ } if (element.parent('.dropdown-menu')) { - element.closest('li.dropdown').addClass('active') + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) } callback && callback() } - transition ? + $active.length && transition ? $active .one('bsTransitionEnd', next) - .emulateTransitionEnd(150) : + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : next() $active.removeClass('in') @@ -120,9 +141,13 @@ // TAB DATA-API // ============ - $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { + 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); http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/tooltip.js ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/tooltip.js b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/tooltip.js index 9cdb6c9..cda147d 100644 --- a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/tooltip.js +++ b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/tooltip.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: tooltip.js v3.2.0 + * Bootstrap: tooltip.js v3.3.1 * http://getbootstrap.com/javascript/#tooltip * Inspired by the original jQuery.tipsy by Jason Frame * ======================================================================== @@ -25,7 +25,9 @@ this.init('tooltip', element, options) } - Tooltip.VERSION = '3.2.0' + Tooltip.VERSION = '3.3.1' + + Tooltip.TRANSITION_DURATION = 150 Tooltip.DEFAULTS = { animation: true, @@ -103,6 +105,11 @@ var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) + if (self && self.$tip && self.$tip.is(':visible')) { + self.hoverState = 'in' + return + } + if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) @@ -145,7 +152,7 @@ if (this.hasContent() && this.enabled) { this.$element.trigger(e) - var inDom = $.contains(document.documentElement, this.$element[0]) + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) if (e.isDefaultPrevented() || !inDom) return var that = this @@ -181,13 +188,13 @@ if (autoPlace) { var orgPlacement = placement - var $parent = this.$element.parent() - var parentDim = this.getPosition($parent) + var $container = this.options.container ? $(this.options.container) : this.$element.parent() + var containerDim = this.getPosition($container) - placement = placement == 'bottom' && pos.top + pos.height + actualHeight - parentDim.scroll > parentDim.height ? 'top' : - placement == 'top' && pos.top - parentDim.scroll - actualHeight < 0 ? 'bottom' : - placement == 'right' && pos.right + actualWidth > parentDim.width ? 'left' : - placement == 'left' && pos.left - actualWidth < parentDim.left ? 'right' : + placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < containerDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > containerDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < containerDim.left ? 'right' : placement $tip @@ -200,14 +207,17 @@ 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(150) : + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() } } @@ -254,16 +264,18 @@ if (delta.left) offset.left += delta.left else offset.top += delta.top - var arrowDelta = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight - var arrowPosition = delta.left ? 'left' : 'top' - var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight' + 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], arrowPosition) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) } - Tooltip.prototype.replaceArrow = function (delta, dimension, position) { - this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '') + Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) { + this.arrow() + .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isHorizontal ? 'top' : 'left', '') } Tooltip.prototype.setContent = function () { @@ -274,16 +286,17 @@ $tip.removeClass('fade in top bottom left right') } - Tooltip.prototype.hide = function () { + Tooltip.prototype.hide = function (callback) { var that = this var $tip = this.tip() var e = $.Event('hide.bs.' + this.type) - this.$element.removeAttr('aria-describedby') - function complete() { if (that.hoverState != 'in') $tip.detach() - that.$element.trigger('hidden.bs.' + that.type) + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + callback && callback() } this.$element.trigger(e) @@ -295,7 +308,7 @@ $.support.transition && this.$tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) - .emulateTransitionEnd(150) : + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() this.hoverState = null @@ -316,13 +329,20 @@ Tooltip.prototype.getPosition = function ($element) { $element = $element || this.$element + var el = $element[0] var isBody = el.tagName == 'BODY' - return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, { - scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(), - width: isBody ? $(window).width() : $element.outerWidth(), - height: isBody ? $(window).height() : $element.outerHeight() - }, isBody ? { top: 0, left: 0 } : $element.offset()) + + 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) { @@ -386,14 +406,6 @@ return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) } - Tooltip.prototype.validate = function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - Tooltip.prototype.enable = function () { this.enabled = true } @@ -420,8 +432,11 @@ } Tooltip.prototype.destroy = function () { + var that = this clearTimeout(this.timeout) - this.hide().$element.off('.' + this.type).removeData('bs.' + this.type) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + }) } @@ -430,12 +445,18 @@ function Plugin(option) { return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tooltip') - var options = typeof option == 'object' && option + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + var selector = options && options.selector if (!data && option == 'destroy') return - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (selector) { + if (!data) $this.data('bs.tooltip', (data = {})) + if (!data[selector]) data[selector] = new Tooltip(this, options) + } else { + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + } if (typeof option == 'string') data[option]() }) } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/transition.js ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/transition.js b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/transition.js index 83f85bf..68c2bd6 100644 --- a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/transition.js +++ b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/bootstrap/js/transition.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: transition.js v3.2.0 + * Bootstrap: transition.js v3.3.1 * http://getbootstrap.com/javascript/#transitions * ======================================================================== * Copyright 2011-2014 Twitter, Inc. http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/fonts/glyphicons-halflings-regular.svg ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/fonts/glyphicons-halflings-regular.svg b/tapestry-webresources/src/test/webapp/bootstrap/fonts/glyphicons-halflings-regular.svg index e3e2dc7..25691af 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/fonts/glyphicons-halflings-regular.svg +++ b/tapestry-webresources/src/test/webapp/bootstrap/fonts/glyphicons-halflings-regular.svg @@ -226,4 +226,4 @@ <glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" /> <glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" /> </font> -</defs></svg> \ No newline at end of file +</defs></svg> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/js/affix.js ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/js/affix.js b/tapestry-webresources/src/test/webapp/bootstrap/js/affix.js index 7d404eb..deea294 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/js/affix.js +++ b/tapestry-webresources/src/test/webapp/bootstrap/js/affix.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: affix.js v3.2.0 + * Bootstrap: affix.js v3.3.1 * http://getbootstrap.com/javascript/#affix * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -28,7 +28,7 @@ this.checkPosition() } - Affix.VERSION = '3.2.0' + Affix.VERSION = '3.3.1' Affix.RESET = 'affix affix-top affix-bottom' @@ -37,6 +37,28 @@ 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 && colliderTop <= 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') @@ -52,42 +74,40 @@ Affix.prototype.checkPosition = function () { if (!this.$element.is(':visible')) return - var scrollHeight = $(document).height() - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() + var height = this.$element.height() var offset = this.options.offset var offsetTop = offset.top var offsetBottom = offset.bottom + var scrollHeight = $('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.unpin != null && (scrollTop + this.unpin <= position.top) ? false : - offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' : - offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) - if (this.affixed === affix) return - if (this.unpin != null) this.$element.css('top', '') + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') - var affixType = 'affix' + (affix ? '-' + affix : '') - var e = $.Event(affixType + '.bs.affix') + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') - this.$element.trigger(e) + this.$element.trigger(e) - if (e.isDefaultPrevented()) return + if (e.isDefaultPrevented()) return - this.affixed = affix - this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null - this.$element - .removeClass(Affix.RESET) - .addClass(affixType) - .trigger($.Event(affixType.replace('affix', 'affixed'))) + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } if (affix == 'bottom') { this.$element.offset({ - top: scrollHeight - this.$element.height() - offsetBottom + top: scrollHeight - height - offsetBottom }) } } @@ -132,8 +152,8 @@ data.offset = data.offset || {} - if (data.offsetBottom) data.offset.bottom = data.offsetBottom - if (data.offsetTop) data.offset.top = data.offsetTop + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop Plugin.call($spy, data) }) http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/js/alert.js ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/js/alert.js b/tapestry-webresources/src/test/webapp/bootstrap/js/alert.js index 0efd92c..7b775dd 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/js/alert.js +++ b/tapestry-webresources/src/test/webapp/bootstrap/js/alert.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: alert.js v3.2.0 + * Bootstrap: alert.js v3.3.1 * http://getbootstrap.com/javascript/#alerts * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -18,7 +18,9 @@ $(el).on('click', dismiss, this.close) } - Alert.VERSION = '3.2.0' + Alert.VERSION = '3.3.1' + + Alert.TRANSITION_DURATION = 150 Alert.prototype.close = function (e) { var $this = $(this) @@ -34,7 +36,7 @@ if (e) e.preventDefault() if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() + $parent = $this.closest('.alert') } $parent.trigger(e = $.Event('close.bs.alert')) @@ -51,7 +53,7 @@ $.support.transition && $parent.hasClass('fade') ? $parent .one('bsTransitionEnd', removeElement) - .emulateTransitionEnd(150) : + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : removeElement() } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/js/button.js ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/js/button.js b/tapestry-webresources/src/test/webapp/bootstrap/js/button.js index dc3164f..7b1e134 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/js/button.js +++ b/tapestry-webresources/src/test/webapp/bootstrap/js/button.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: button.js v3.2.0 + * Bootstrap: button.js v3.3.1 * http://getbootstrap.com/javascript/#buttons * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -19,7 +19,7 @@ this.isLoading = false } - Button.VERSION = '3.2.0' + Button.VERSION = '3.3.1' Button.DEFAULTS = { loadingText: 'loading...' @@ -35,10 +35,10 @@ if (data.resetText == null) $el.data('resetText', $el[val]()) - $el[val](data[state] == null ? this.options[state] : data[state]) - // 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) @@ -60,6 +60,8 @@ else $parent.find('.active').removeClass('active') } if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) } if (changed) this.$element.toggleClass('active') @@ -100,11 +102,15 @@ // 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') - e.preventDefault() - }) + $(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') + 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); http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/js/carousel.js ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/js/carousel.js b/tapestry-webresources/src/test/webapp/bootstrap/js/carousel.js index b7da1ba..282d618 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/js/carousel.js +++ b/tapestry-webresources/src/test/webapp/bootstrap/js/carousel.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: carousel.js v3.2.0 + * Bootstrap: carousel.js v3.3.1 * http://getbootstrap.com/javascript/#carousel * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -14,7 +14,7 @@ // ========================= var Carousel = function (element, options) { - this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this)) + this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = @@ -23,20 +23,26 @@ this.$active = this.$items = null - this.options.pause == 'hover' && this.$element + 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.2.0' + Carousel.VERSION = '3.3.1' + + Carousel.TRANSITION_DURATION = 600 Carousel.DEFAULTS = { interval: 5000, pause: 'hover', - wrap: true + 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 @@ -63,6 +69,13 @@ return this.$items.index(item || this.$active) } + Carousel.prototype.getItemForDirection = function (direction, active) { + var delta = direction == 'prev' ? -1 : 1 + var activeIndex = this.getItemIndex(active) + 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')) @@ -72,7 +85,7 @@ 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[pos])) + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) } Carousel.prototype.pause = function (e) { @@ -100,7 +113,7 @@ Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') - var $next = next || $active[type]() + var $next = next || this.getItemForDirection(type, $active) var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' var fallback = type == 'next' ? 'first' : 'last' @@ -146,7 +159,7 @@ that.$element.trigger(slidEvent) }, 0) }) - .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) } else { $active.removeClass('active') $next.addClass('active') @@ -195,7 +208,7 @@ // CAROUSEL DATA-API // ================= - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + 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 @@ -211,7 +224,11 @@ } 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 () { http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/js/collapse.js ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/js/collapse.js b/tapestry-webresources/src/test/webapp/bootstrap/js/collapse.js index e4e6d79..b2cc125 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/js/collapse.js +++ b/tapestry-webresources/src/test/webapp/bootstrap/js/collapse.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: collapse.js v3.2.0 + * Bootstrap: collapse.js v3.3.1 * http://getbootstrap.com/javascript/#collapse * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -16,16 +16,25 @@ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $(this.options.trigger).filter('[href="#' + element.id + '"], [data-target="#' + element.id + '"]') this.transitioning = null - if (this.options.parent) this.$parent = $(this.options.parent) + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + if (this.options.toggle) this.toggle() } - Collapse.VERSION = '3.2.0' + Collapse.VERSION = '3.3.1' + + Collapse.TRANSITION_DURATION = 350 Collapse.DEFAULTS = { - toggle: true + toggle: true, + trigger: '[data-toggle="collapse"]' } Collapse.prototype.dimension = function () { @@ -36,17 +45,21 @@ Collapse.prototype.show = function () { if (this.transitioning || this.$element.hasClass('in')) return + var activesData + var actives = this.$parent && this.$parent.find('> .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 - var actives = this.$parent && this.$parent.find('> .panel > .in') - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return Plugin.call(actives, 'hide') - hasData || actives.data('bs.collapse', null) + activesData || actives.data('bs.collapse', null) } var dimension = this.dimension() @@ -54,6 +67,11 @@ this.$element .removeClass('collapse') .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) this.transitioning = 1 @@ -72,7 +90,7 @@ this.$element .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize]) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) } Collapse.prototype.hide = function () { @@ -88,17 +106,21 @@ this.$element .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') + .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 - .trigger('hidden.bs.collapse') .removeClass('collapsing') .addClass('collapse') + .trigger('hidden.bs.collapse') } if (!$.support.transition) return complete.call(this) @@ -106,13 +128,40 @@ this.$element [dimension](0) .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(350) + .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 // ========================== @@ -123,7 +172,7 @@ var data = $this.data('bs.collapse') var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - if (!data && options.toggle && option == 'show') option = !option + if (!data && options.toggle && option == 'show') options.toggle = false if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) @@ -148,21 +197,13 @@ // ================= $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { - var href var $this = $(this) - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $.extend({}, $this.data(), { trigger: this }) Plugin.call($target, option) }) http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/js/dropdown.js ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/js/dropdown.js b/tapestry-webresources/src/test/webapp/bootstrap/js/dropdown.js index 88f118c..69a40f6 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/js/dropdown.js +++ b/tapestry-webresources/src/test/webapp/bootstrap/js/dropdown.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: dropdown.js v3.2.0 + * Bootstrap: dropdown.js v3.3.1 * http://getbootstrap.com/javascript/#dropdowns * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -19,7 +19,7 @@ $(element).on('click.bs.dropdown', this.toggle) } - Dropdown.VERSION = '3.2.0' + Dropdown.VERSION = '3.3.1' Dropdown.prototype.toggle = function (e) { var $this = $(this) @@ -42,7 +42,9 @@ if (e.isDefaultPrevented()) return - $this.trigger('focus') + $this + .trigger('focus') + .attr('aria-expanded', 'true') $parent .toggleClass('open') @@ -53,7 +55,7 @@ } Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27)/.test(e.keyCode)) return + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return var $this = $(this) @@ -65,7 +67,7 @@ var $parent = getParent($this) var isActive = $parent.hasClass('open') - if (!isActive || (isActive && e.keyCode == 27)) { + if ((!isActive && e.which != 27) || (isActive && e.which == 27)) { if (e.which == 27) $parent.find(toggle).trigger('focus') return $this.trigger('click') } @@ -75,10 +77,10 @@ if (!$items.length) return - var index = $items.index($items.filter(':focus')) + var index = $items.index(e.target) - if (e.keyCode == 38 && index > 0) index-- // up - if (e.keyCode == 40 && index < $items.length - 1) index++ // down + 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') @@ -88,11 +90,17 @@ if (e && e.which === 3) return $(backdrop).remove() $(toggle).each(function () { - var $parent = getParent($(this)) + var $this = $(this) + var $parent = getParent($this) var relatedTarget = { relatedTarget: this } + if (!$parent.hasClass('open')) return + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) }) } @@ -146,6 +154,8 @@ .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 + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown) }(jQuery); http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/js/modal.js ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/js/modal.js b/tapestry-webresources/src/test/webapp/bootstrap/js/modal.js index 29eedf1..93891aa 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/js/modal.js +++ b/tapestry-webresources/src/test/webapp/bootstrap/js/modal.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: modal.js v3.2.0 + * Bootstrap: modal.js v3.3.1 * http://getbootstrap.com/javascript/#modals * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -30,7 +30,10 @@ } } - Modal.VERSION = '3.2.0' + Modal.VERSION = '3.3.1' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 Modal.DEFAULTS = { backdrop: true, @@ -53,10 +56,11 @@ this.isShown = true this.checkScrollbar() + this.setScrollbar() this.$body.addClass('modal-open') - this.setScrollbar() this.escape() + this.resize() this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) @@ -71,6 +75,9 @@ .show() .scrollTop(0) + if (that.options.backdrop) that.adjustBackdrop() + that.adjustDialog() + if (transition) { that.$element[0].offsetWidth // force reflow } @@ -88,7 +95,7 @@ .one('bsTransitionEnd', function () { that.$element.trigger('focus').trigger(e) }) - .emulateTransitionEnd(300) : + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : that.$element.trigger('focus').trigger(e) }) } @@ -104,10 +111,8 @@ this.isShown = false - this.$body.removeClass('modal-open') - - this.resetScrollbar() this.escape() + this.resize() $(document).off('focusin.bs.modal') @@ -119,7 +124,7 @@ $.support.transition && this.$element.hasClass('fade') ? this.$element .one('bsTransitionEnd', $.proxy(this.hideModal, this)) - .emulateTransitionEnd(300) : + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : this.hideModal() } @@ -135,11 +140,19 @@ Modal.prototype.escape = function () { if (this.isShown && this.options.keyboard) { - this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { e.which == 27 && this.hide() }, this)) } else if (!this.isShown) { - this.$element.off('keyup.dismiss.bs.modal') + 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') } } @@ -147,6 +160,9 @@ var that = this this.$element.hide() this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() that.$element.trigger('hidden.bs.modal') }) } @@ -164,14 +180,13 @@ var doAnimate = $.support.transition && animate this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') - .appendTo(this.$body) - - this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { - if (e.target !== e.currentTarget) return - this.options.backdrop == 'static' - ? this.$element[0].focus.call(this.$element[0]) - : this.hide.call(this) - }, this)) + .prependTo(this.$element) + .on('click.dismiss.bs.modal', $.proxy(function (e) { + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus.call(this.$element[0]) + : this.hide.call(this) + }, this)) if (doAnimate) this.$backdrop[0].offsetWidth // force reflow @@ -182,7 +197,7 @@ doAnimate ? this.$backdrop .one('bsTransitionEnd', callback) - .emulateTransitionEnd(150) : + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callback() } else if (!this.isShown && this.$backdrop) { @@ -195,7 +210,7 @@ $.support.transition && this.$element.hasClass('fade') ? this.$backdrop .one('bsTransitionEnd', callbackRemove) - .emulateTransitionEnd(150) : + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callbackRemove() } else if (callback) { @@ -203,14 +218,43 @@ } } + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + if (this.options.backdrop) this.adjustBackdrop() + this.adjustDialog() + } + + Modal.prototype.adjustBackdrop = function () { + this.$backdrop + .css('height', 0) + .css('height', this.$element[0].scrollHeight) + } + + 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 () { - if (document.body.clientWidth >= window.innerWidth) return - this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar() + this.bodyIsOverflowing = document.body.scrollHeight > document.documentElement.clientHeight + this.scrollbarWidth = this.measureScrollbar() } Modal.prototype.setScrollbar = function () { var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) - if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) } Modal.prototype.resetScrollbar = function () { http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/js/popover.js ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/js/popover.js b/tapestry-webresources/src/test/webapp/bootstrap/js/popover.js index 825e1b3..db272bd 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/js/popover.js +++ b/tapestry-webresources/src/test/webapp/bootstrap/js/popover.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: popover.js v3.2.0 + * Bootstrap: popover.js v3.3.1 * http://getbootstrap.com/javascript/#popovers * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -19,7 +19,7 @@ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') - Popover.VERSION = '3.2.0' + Popover.VERSION = '3.3.1' Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { placement: 'right', @@ -46,7 +46,7 @@ var content = this.getContent() $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events + $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) @@ -86,12 +86,18 @@ function Plugin(option) { return this.each(function () { - var $this = $(this) - var data = $this.data('bs.popover') - var options = typeof option == 'object' && option + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + var selector = options && options.selector if (!data && option == 'destroy') return - if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (selector) { + if (!data) $this.data('bs.popover', (data = {})) + if (!data[selector]) data[selector] = new Popover(this, options) + } else { + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + } if (typeof option == 'string') data[option]() }) } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/js/scrollspy.js ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/js/scrollspy.js b/tapestry-webresources/src/test/webapp/bootstrap/js/scrollspy.js index db23787..c468262 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/js/scrollspy.js +++ b/tapestry-webresources/src/test/webapp/bootstrap/js/scrollspy.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: scrollspy.js v3.2.0 + * Bootstrap: scrollspy.js v3.3.1 * http://getbootstrap.com/javascript/#scrollspy * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -30,7 +30,7 @@ this.process() } - ScrollSpy.VERSION = '3.2.0' + ScrollSpy.VERSION = '3.3.1' ScrollSpy.DEFAULTS = { offset: 10 @@ -91,8 +91,9 @@ return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) } - if (activeTarget && scrollTop <= offsets[0]) { - return activeTarget != (i = targets[0]) && this.activate(i) + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() } for (i = offsets.length; i--;) { @@ -106,9 +107,7 @@ ScrollSpy.prototype.activate = function (target) { this.activeTarget = target - $(this.selector) - .parentsUntil(this.options.target, '.active') - .removeClass('active') + this.clear() var selector = this.selector + '[data-target="' + target + '"],' + @@ -127,6 +126,12 @@ active.trigger('activate.bs.scrollspy') } + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + // SCROLLSPY PLUGIN DEFINITION // =========================== http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/js/tab.js ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/js/tab.js b/tapestry-webresources/src/test/webapp/bootstrap/js/tab.js index c0e1e46..d59827f 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/js/tab.js +++ b/tapestry-webresources/src/test/webapp/bootstrap/js/tab.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: tab.js v3.2.0 + * Bootstrap: tab.js v3.3.1 * http://getbootstrap.com/javascript/#tabs * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -17,7 +17,9 @@ this.element = $(element) } - Tab.VERSION = '3.2.0' + Tab.VERSION = '3.3.1' + + Tab.TRANSITION_DURATION = 150 Tab.prototype.show = function () { var $this = this.element @@ -31,22 +33,30 @@ if ($this.parent('li').hasClass('active')) return - var previous = $ul.find('.active:last a')[0] - var e = $.Event('show.bs.tab', { - relatedTarget: previous + 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] }) - $this.trigger(e) + $previous.trigger(hideEvent) + $this.trigger(showEvent) - if (e.isDefaultPrevented()) return + 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 + relatedTarget: $previous[0] }) }) } @@ -55,15 +65,21 @@ var $active = container.find('> .active') var transition = callback && $.support.transition - && $active.hasClass('fade') + && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length) function next() { $active .removeClass('active') .find('> .dropdown-menu > .active') - .removeClass('active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) - element.addClass('active') + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) if (transition) { element[0].offsetWidth // reflow for transition @@ -73,16 +89,21 @@ } if (element.parent('.dropdown-menu')) { - element.closest('li.dropdown').addClass('active') + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) } callback && callback() } - transition ? + $active.length && transition ? $active .one('bsTransitionEnd', next) - .emulateTransitionEnd(150) : + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : next() $active.removeClass('in') @@ -120,9 +141,13 @@ // TAB DATA-API // ============ - $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { + 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); http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/js/tooltip.js ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/js/tooltip.js b/tapestry-webresources/src/test/webapp/bootstrap/js/tooltip.js index 9cdb6c9..cda147d 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/js/tooltip.js +++ b/tapestry-webresources/src/test/webapp/bootstrap/js/tooltip.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: tooltip.js v3.2.0 + * Bootstrap: tooltip.js v3.3.1 * http://getbootstrap.com/javascript/#tooltip * Inspired by the original jQuery.tipsy by Jason Frame * ======================================================================== @@ -25,7 +25,9 @@ this.init('tooltip', element, options) } - Tooltip.VERSION = '3.2.0' + Tooltip.VERSION = '3.3.1' + + Tooltip.TRANSITION_DURATION = 150 Tooltip.DEFAULTS = { animation: true, @@ -103,6 +105,11 @@ var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) + if (self && self.$tip && self.$tip.is(':visible')) { + self.hoverState = 'in' + return + } + if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) @@ -145,7 +152,7 @@ if (this.hasContent() && this.enabled) { this.$element.trigger(e) - var inDom = $.contains(document.documentElement, this.$element[0]) + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) if (e.isDefaultPrevented() || !inDom) return var that = this @@ -181,13 +188,13 @@ if (autoPlace) { var orgPlacement = placement - var $parent = this.$element.parent() - var parentDim = this.getPosition($parent) + var $container = this.options.container ? $(this.options.container) : this.$element.parent() + var containerDim = this.getPosition($container) - placement = placement == 'bottom' && pos.top + pos.height + actualHeight - parentDim.scroll > parentDim.height ? 'top' : - placement == 'top' && pos.top - parentDim.scroll - actualHeight < 0 ? 'bottom' : - placement == 'right' && pos.right + actualWidth > parentDim.width ? 'left' : - placement == 'left' && pos.left - actualWidth < parentDim.left ? 'right' : + placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < containerDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > containerDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < containerDim.left ? 'right' : placement $tip @@ -200,14 +207,17 @@ 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(150) : + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() } } @@ -254,16 +264,18 @@ if (delta.left) offset.left += delta.left else offset.top += delta.top - var arrowDelta = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight - var arrowPosition = delta.left ? 'left' : 'top' - var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight' + 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], arrowPosition) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) } - Tooltip.prototype.replaceArrow = function (delta, dimension, position) { - this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '') + Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) { + this.arrow() + .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isHorizontal ? 'top' : 'left', '') } Tooltip.prototype.setContent = function () { @@ -274,16 +286,17 @@ $tip.removeClass('fade in top bottom left right') } - Tooltip.prototype.hide = function () { + Tooltip.prototype.hide = function (callback) { var that = this var $tip = this.tip() var e = $.Event('hide.bs.' + this.type) - this.$element.removeAttr('aria-describedby') - function complete() { if (that.hoverState != 'in') $tip.detach() - that.$element.trigger('hidden.bs.' + that.type) + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + callback && callback() } this.$element.trigger(e) @@ -295,7 +308,7 @@ $.support.transition && this.$tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) - .emulateTransitionEnd(150) : + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() this.hoverState = null @@ -316,13 +329,20 @@ Tooltip.prototype.getPosition = function ($element) { $element = $element || this.$element + var el = $element[0] var isBody = el.tagName == 'BODY' - return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, { - scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(), - width: isBody ? $(window).width() : $element.outerWidth(), - height: isBody ? $(window).height() : $element.outerHeight() - }, isBody ? { top: 0, left: 0 } : $element.offset()) + + 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) { @@ -386,14 +406,6 @@ return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) } - Tooltip.prototype.validate = function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - Tooltip.prototype.enable = function () { this.enabled = true } @@ -420,8 +432,11 @@ } Tooltip.prototype.destroy = function () { + var that = this clearTimeout(this.timeout) - this.hide().$element.off('.' + this.type).removeData('bs.' + this.type) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + }) } @@ -430,12 +445,18 @@ function Plugin(option) { return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tooltip') - var options = typeof option == 'object' && option + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + var selector = options && options.selector if (!data && option == 'destroy') return - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (selector) { + if (!data) $this.data('bs.tooltip', (data = {})) + if (!data[selector]) data[selector] = new Tooltip(this, options) + } else { + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + } if (typeof option == 'string') data[option]() }) } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/js/transition.js ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/js/transition.js b/tapestry-webresources/src/test/webapp/bootstrap/js/transition.js index 83f85bf..68c2bd6 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/js/transition.js +++ b/tapestry-webresources/src/test/webapp/bootstrap/js/transition.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: transition.js v3.2.0 + * Bootstrap: transition.js v3.3.1 * http://getbootstrap.com/javascript/#transitions * ======================================================================== * Copyright 2011-2014 Twitter, Inc. http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/badges.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/badges.less b/tapestry-webresources/src/test/webapp/bootstrap/less/badges.less index 20624f3..b27c405 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/badges.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/badges.less @@ -44,11 +44,17 @@ } // Account for badges in navs - a.list-group-item.active > &, + .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; } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/button-groups.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/button-groups.less b/tapestry-webresources/src/test/webapp/bootstrap/less/button-groups.less index 7021ecd..f84febb 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/button-groups.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/button-groups.less @@ -18,10 +18,6 @@ &.active { z-index: 2; } - &:focus { - // Remove focus outline when dropdown JS adds it after closing the menu - outline: 0; - } } } @@ -198,7 +194,6 @@ } - // Justified button groups // ---------------------- @@ -226,15 +221,23 @@ // 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 `opacity`. We cannot -// use `display: none;` or `visibility: hidden;` as that also hides the popover. +// `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 for more. +// See https://github.com/twbs/bootstrap/pull/12794 and +// https://github.com/twbs/bootstrap/pull/14559 for more information. -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - position: absolute; - z-index: -1; - .opacity(0); +[data-toggle="buttons"] { + > .btn, + > .btn-group > .btn { + input[type="radio"], + input[type="checkbox"] { + position: absolute; + clip: rect(0,0,0,0); + pointer-events: none; + } + } } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/buttons.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/buttons.less b/tapestry-webresources/src/test/webapp/bootstrap/less/buttons.less index 492bdc6..40553c6 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/buttons.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/buttons.less @@ -12,6 +12,7 @@ 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; @@ -22,13 +23,15 @@ &, &:active, &.active { - &:focus { + &:focus, + &.focus { .tab-focus(); } } &:hover, - &:focus { + &:focus, + &.focus { color: @btn-default-color; text-decoration: none; } @@ -43,7 +46,7 @@ &.disabled, &[disabled], fieldset[disabled] & { - cursor: not-allowed; + cursor: @cursor-disabled; pointer-events: none; // Future-proof disabling of clicks .opacity(.65); .box-shadow(none); @@ -85,11 +88,11 @@ .btn-link { color: @link-color; font-weight: normal; - cursor: pointer; border-radius: 0; &, &:active, + &.active, &[disabled], fieldset[disabled] & { background-color: transparent; http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/carousel.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/carousel.less b/tapestry-webresources/src/test/webapp/bootstrap/less/carousel.less index 1644ddf..5724d8a 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/carousel.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/carousel.less @@ -24,6 +24,30 @@ &:extend(.img-responsive); line-height: 1; } + + // WebKit CSS3 transforms for supported devices + @media all and (transform-3d), (-webkit-transform-3d) { + transition: transform .6s ease-in-out; + backface-visibility: hidden; + perspective: 1000; + + &.next, + &.active.right { + transform: translate3d(100%, 0, 0); + left: 0; + } + &.prev, + &.active.left { + transform: translate3d(-100%, 0, 0); + left: 0; + } + &.next.left, + &.prev.right, + &.active { + transform: translate3d(0, 0, 0); + left: 0; + } + } } > .active, http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/code.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/code.less b/tapestry-webresources/src/test/webapp/bootstrap/less/code.less index baa13df..a08b4d4 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/code.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/code.less @@ -32,6 +32,7 @@ kbd { kbd { padding: 0; font-size: 100%; + font-weight: bold; box-shadow: none; } } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/component-animations.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/component-animations.less b/tapestry-webresources/src/test/webapp/bootstrap/less/component-animations.less index 9400a0d..967715d 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/component-animations.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/component-animations.less @@ -17,8 +17,9 @@ .collapse { display: none; + visibility: hidden; - &.in { display: block; } + &.in { display: block; visibility: visible; } tr&.in { display: table-row; } tbody&.in { display: table-row-group; } } @@ -27,5 +28,7 @@ position: relative; height: 0; overflow: hidden; - .transition(height .35s ease); + .transition-property(~"height, visibility"); + .transition-duration(.35s); + .transition-timing-function(ease); } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/dropdowns.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/dropdowns.less b/tapestry-webresources/src/test/webapp/bootstrap/less/dropdowns.less index 3eb7fc0..84a48c1 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/dropdowns.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/dropdowns.less @@ -103,16 +103,15 @@ &:focus { color: @dropdown-link-disabled-color; } -} -// Nuke hover/focus effects -.dropdown-menu > .disabled > a { + + // Nuke hover/focus effects &:hover, &:focus { text-decoration: none; background-color: transparent; background-image: none; // Remove CSS gradient .reset-filter(); - cursor: not-allowed; + cursor: @cursor-disabled; } } @@ -212,4 +211,3 @@ } } } - http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/forms.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/forms.less b/tapestry-webresources/src/test/webapp/bootstrap/less/forms.less index 2c5e9bf..1bcc2b6 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/forms.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/forms.less @@ -141,7 +141,7 @@ output { &[disabled], &[readonly], fieldset[disabled] & { - cursor: not-allowed; + cursor: @cursor-disabled; background-color: @input-bg-disabled; opacity: 1; // iOS fix for unreadable disabled content } @@ -168,23 +168,27 @@ input[type="search"] { // 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. Since this fucks up everything else, we have to -// appropriately reset it for Internet Explorer and the size variations. - -input[type="date"], -input[type="time"], -input[type="datetime-local"], -input[type="month"] { - line-height: @input-height-base; - // IE8+ misaligns the text within date inputs, so we reset - line-height: @line-height-base ~"\0"; - - &.input-sm { +// 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. + +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: @input-height-base; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm { line-height: @input-height-small; } - &.input-lg { + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg { line-height: @input-height-large; } } @@ -208,11 +212,11 @@ input[type="month"] { .checkbox { position: relative; display: block; - min-height: @line-height-computed; // clear the floating input if there is no label text 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; @@ -258,7 +262,7 @@ input[type="checkbox"] { &[disabled], &.disabled, fieldset[disabled] & { - cursor: not-allowed; + cursor: @cursor-disabled; } } // These classes are used directly on <label>s @@ -266,7 +270,7 @@ input[type="checkbox"] { .checkbox-inline { &.disabled, fieldset[disabled] & { - cursor: not-allowed; + cursor: @cursor-disabled; } } // These classes are used on elements with <label> descendants @@ -275,7 +279,7 @@ input[type="checkbox"] { &.disabled, fieldset[disabled] & { label { - cursor: not-allowed; + cursor: @cursor-disabled; } } } @@ -306,12 +310,14 @@ input[type="checkbox"] { // Build on `.form-control` with modifier classes to decrease or increase the // height and font-size of form controls. -.input-sm { - .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small); +.input-sm, +.form-group-sm .form-control { + .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small); } -.input-lg { - .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large); +.input-lg, +.form-group-lg .form-control { + .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large); } @@ -331,7 +337,7 @@ input[type="checkbox"] { // Feedback icon (requires .glyphicon classes) .form-control-feedback { position: absolute; - top: (@line-height-computed + 5); // Height of the `label` and its margin + top: 0; right: 0; z-index: 2; // Ensure icon is above input groups display: block; @@ -339,6 +345,7 @@ input[type="checkbox"] { height: @input-height-base; line-height: @input-height-base; text-align: center; + pointer-events: none; } .input-lg + .form-control-feedback { width: @input-height-large; @@ -362,10 +369,15 @@ input[type="checkbox"] { .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg); } +// Reposition feedback icon if input has visible label above +.has-feedback label { -// Reposition feedback icon if label is hidden with "screenreader only" state -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; + & ~ .form-control-feedback { + top: (@line-height-computed + 5); // Height of the `label` and its margin + } + &.sr-only ~ .form-control-feedback { + top: 0; + } } @@ -382,7 +394,6 @@ input[type="checkbox"] { } - // Inline forms // // Make forms appear inline(-block) by adding the `.form-inline` class. Inline @@ -412,6 +423,11 @@ input[type="checkbox"] { vertical-align: middle; } + // Make static controls behave like regular ones + .form-control-static { + display: inline-block; + } + .input-group { display: inline-table; vertical-align: middle; @@ -453,10 +469,7 @@ input[type="checkbox"] { margin-left: 0; } - // 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. + // Re-override the feedback icon. .has-feedback .form-control-feedback { top: 0; } @@ -509,7 +522,6 @@ input[type="checkbox"] { // 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 { - top: 0; right: (@grid-gutter-width / 2); } @@ -523,9 +535,6 @@ input[type="checkbox"] { padding-top: ((@padding-large-vertical * @line-height-large) + 1); } } - .form-control { - &:extend(.input-lg); - } } .form-group-sm { @media (min-width: @screen-sm-min) { @@ -533,8 +542,5 @@ input[type="checkbox"] { padding-top: (@padding-small-vertical + 1); } } - .form-control { - &:extend(.input-sm); - } } } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/glyphicons.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/glyphicons.less b/tapestry-webresources/src/test/webapp/bootstrap/less/glyphicons.less index d3485dc..6eab7f7 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/glyphicons.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/glyphicons.less @@ -33,7 +33,8 @@ // Individual icons .glyphicon-asterisk { &:before { content: "\2a"; } } .glyphicon-plus { &:before { content: "\2b"; } } -.glyphicon-euro { &:before { content: "\20ac"; } } +.glyphicon-euro, +.glyphicon-eur { &:before { content: "\20ac"; } } .glyphicon-minus { &:before { content: "\2212"; } } .glyphicon-cloud { &:before { content: "\2601"; } } .glyphicon-envelope { &:before { content: "\2709"; } } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/jumbotron.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/jumbotron.less b/tapestry-webresources/src/test/webapp/bootstrap/less/jumbotron.less index 27cd8b8..340d4a3 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/jumbotron.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/jumbotron.less @@ -4,7 +4,7 @@ .jumbotron { - padding: @jumbotron-padding; + padding: @jumbotron-padding (@jumbotron-padding / 2); margin-bottom: @jumbotron-padding; color: @jumbotron-color; background-color: @jumbotron-bg; @@ -23,7 +23,8 @@ border-top-color: darken(@jumbotron-bg, 10%); } - .container & { + .container &, + .container-fluid & { border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container } @@ -32,10 +33,10 @@ } @media screen and (min-width: @screen-sm-min) { - padding-top: (@jumbotron-padding * 1.6); - padding-bottom: (@jumbotron-padding * 1.6); + padding: (@jumbotron-padding * 1.6) 0; - .container & { + .container &, + .container-fluid & { padding-left: (@jumbotron-padding * 2); padding-right: (@jumbotron-padding * 2); } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/list-group.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/list-group.less b/tapestry-webresources/src/test/webapp/bootstrap/less/list-group.less index 1946bf5..1462ce1 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/list-group.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/list-group.less @@ -35,14 +35,6 @@ margin-bottom: 0; .border-bottom-radius(@list-group-border-radius); } - - // Align badges within list items - > .badge { - float: right; - } - > .badge + .badge { - margin-right: 5px; - } } @@ -74,6 +66,7 @@ a.list-group-item { &.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 { http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/media.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/media.less b/tapestry-webresources/src/test/webapp/bootstrap/less/media.less index 5ad22cd..292e98d 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/media.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/media.less @@ -1,54 +1,45 @@ -// Media objects -// Source: http://stubbornella.org/content/?p=497 -// -------------------------------------------------- +.media { + // Proper spacing between instances of .media + margin-top: 15px; + + &:first-child { + margin-top: 0; + } +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} -// Common styles -// ------------------------- +.media-left, +.media > .pull-left { + padding-right: 10px; +} -// Clear the floats -.media, +.media-left, +.media-right, .media-body { - overflow: hidden; - zoom: 1; + display: table-cell; + vertical-align: top; } -// Proper spacing between instances of .media -.media, -.media .media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; +.media-middle { + vertical-align: middle; } -// For images and videos, set to block -.media-object { - display: block; +.media-bottom { + vertical-align: bottom; } // Reset margins on headings for tighter default spacing .media-heading { - margin: 0 0 5px; -} - - -// Media image alignment -// ------------------------- - -.media { - > .pull-left { - margin-right: 10px; - } - > .pull-right { - margin-left: 10px; - } + margin-top: 0; + margin-bottom: 5px; } - // Media list variation -// ------------------------- - +// // Undo default ul/ol styles .media-list { padding-left: 0; http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/buttons.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/buttons.less b/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/buttons.less index 409f8f2..92d8a05 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/buttons.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/buttons.less @@ -10,6 +10,7 @@ &:hover, &:focus, + &.focus, &:active, &.active, .open > .dropdown-toggle& { @@ -28,6 +29,7 @@ &, &:hover, &:focus, + &.focus, &:active, &.active { background-color: @background; http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/forms.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/forms.less b/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/forms.less index e36c4a8..6f55ed9 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/forms.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/forms.less @@ -10,7 +10,11 @@ .radio, .checkbox, .radio-inline, - .checkbox-inline { + .checkbox-inline, + &.radio label, + &.checkbox label, + &.radio-inline label, + &.checkbox-inline label { color: @text-color; } // Set the border and box shadow on specific inputs to match http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/grid-framework.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/grid-framework.less b/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/grid-framework.less index 6317854..f3b3929 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/grid-framework.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/grid-framework.less @@ -5,7 +5,7 @@ .make-grid-columns() { // Common styles for all sizes of grid columns, widths 1-12 - .col(@index) when (@index = 1) { // initial + .col(@index) { // initial @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}"; .col((@index + 1), @item); } @@ -27,7 +27,7 @@ } .float-grid-columns(@class) { - .col(@index) when (@index = 1) { // initial + .col(@index) { // initial @item: ~".col-@{class}-@{index}"; .col((@index + 1), @item); } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/3a4991af/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/image.less ---------------------------------------------------------------------- diff --git a/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/image.less b/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/image.less index 5d2cccb..f233cb3 100644 --- a/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/image.less +++ b/tapestry-webresources/src/test/webapp/bootstrap/less/mixins/image.less @@ -8,7 +8,6 @@ // Keep images from scaling beyond the width of their parents. .img-responsive(@display: block) { display: @display; - width: 100% \9; // Force IE10 and below to size SVG images correctly max-width: 100%; // Part 1: Set a maximum relative to the parent height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching }