diff options
19 files changed, 151 insertions, 118 deletions
diff --git a/assets/javascripts/bootstrap.js b/assets/javascripts/bootstrap.js index 30409f4..a7870a9 100644 --- a/assets/javascripts/bootstrap.js +++ b/assets/javascripts/bootstrap.js @@ -83,7 +83,7 @@ this.$element .removeClass(Affix.RESET) .addClass(affixType) - .trigger($.Event(affixType.replace('affix', 'affixed'))) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') if (affix == 'bottom') { this.$element.offset({ @@ -333,15 +333,31 @@ } + // FOCUS SHIM (FOR BUTTON GROUPS) + // ============================== + + function getBtnTarget(target) { + var $target = $(target) + return $target.hasClass('btn') ? $target : $target.parent('.btn') + } + + // 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', '[data-toggle^="button"]', function (e) { + getBtnTarget(e.target).addClass('focus') + }) + .on('blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + getBtnTarget(e.target).removeClass('focus') + }) }(jQuery); @@ -659,8 +675,7 @@ this.$element .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') + .removeClass('collapse in') this.transitioning = 1 @@ -732,7 +747,7 @@ 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') + $this.toggleClass('collapsed', $target.hasClass('in')) } Plugin.call($target, option) @@ -949,7 +964,7 @@ 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 @@ -973,7 +988,7 @@ callback && callback() } - transition ? + $active.length && transition ? $active .one('bsTransitionEnd', next) .emulateTransitionEnd(150) : @@ -1389,11 +1404,11 @@ 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') } } @@ -1420,7 +1435,7 @@ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') .appendTo(this.$body) - this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + this.$element.on('mousedown.dismiss.bs.modal', $.proxy(function (e) { if (e.target !== e.currentTarget) return this.options.backdrop == 'static' ? this.$element[0].focus.call(this.$element[0]) @@ -1851,13 +1866,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(), + var isSvg = window.SVGElement && el instanceof window.SVGElement + + var elRect = el.getBoundingClientRect ? el.getBoundingClientRect() : null + var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isSvg ? {} : { width: isBody ? $(window).width() : $element.outerWidth(), height: isBody ? $(window).height() : $element.outerHeight() - }, isBody ? { top: 0, left: 0 } : $element.offset()) + } + + return $.extend({}, elRect, scroll, outerDims, elOffset) } Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { diff --git a/assets/javascripts/bootstrap/affix.js b/assets/javascripts/bootstrap/affix.js index 7d404eb..26b09db 100644 --- a/assets/javascripts/bootstrap/affix.js +++ b/assets/javascripts/bootstrap/affix.js @@ -83,7 +83,7 @@ this.$element .removeClass(Affix.RESET) .addClass(affixType) - .trigger($.Event(affixType.replace('affix', 'affixed'))) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') if (affix == 'bottom') { this.$element.offset({ diff --git a/assets/javascripts/bootstrap/button.js b/assets/javascripts/bootstrap/button.js index dc3164f..7e2a6e4 100644 --- a/assets/javascripts/bootstrap/button.js +++ b/assets/javascripts/bootstrap/button.js @@ -97,14 +97,30 @@ } + // FOCUS SHIM (FOR BUTTON GROUPS) + // ============================== + + function getBtnTarget(target) { + var $target = $(target) + return $target.hasClass('btn') ? $target : $target.parent('.btn') + } + + // 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', '[data-toggle^="button"]', function (e) { + getBtnTarget(e.target).addClass('focus') + }) + .on('blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + getBtnTarget(e.target).removeClass('focus') + }) }(jQuery); diff --git a/assets/javascripts/bootstrap/collapse.js b/assets/javascripts/bootstrap/collapse.js index e4e6d79..5a52424 100644 --- a/assets/javascripts/bootstrap/collapse.js +++ b/assets/javascripts/bootstrap/collapse.js @@ -88,8 +88,7 @@ this.$element .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') + .removeClass('collapse in') this.transitioning = 1 @@ -161,7 +160,7 @@ 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') + $this.toggleClass('collapsed', $target.hasClass('in')) } Plugin.call($target, option) diff --git a/assets/javascripts/bootstrap/modal.js b/assets/javascripts/bootstrap/modal.js index 29eedf1..fdefdd2 100644 --- a/assets/javascripts/bootstrap/modal.js +++ b/assets/javascripts/bootstrap/modal.js @@ -135,11 +135,11 @@ 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') } } @@ -166,7 +166,7 @@ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') .appendTo(this.$body) - this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + this.$element.on('mousedown.dismiss.bs.modal', $.proxy(function (e) { if (e.target !== e.currentTarget) return this.options.backdrop == 'static' ? this.$element[0].focus.call(this.$element[0]) diff --git a/assets/javascripts/bootstrap/tab.js b/assets/javascripts/bootstrap/tab.js index c0e1e46..573b369 100644 --- a/assets/javascripts/bootstrap/tab.js +++ b/assets/javascripts/bootstrap/tab.js @@ -55,7 +55,7 @@ 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 @@ -79,7 +79,7 @@ callback && callback() } - transition ? + $active.length && transition ? $active .one('bsTransitionEnd', next) .emulateTransitionEnd(150) : diff --git a/assets/javascripts/bootstrap/tooltip.js b/assets/javascripts/bootstrap/tooltip.js index 9cdb6c9..0c3a79d 100644 --- a/assets/javascripts/bootstrap/tooltip.js +++ b/assets/javascripts/bootstrap/tooltip.js @@ -316,13 +316,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(), + var isSvg = window.SVGElement && el instanceof window.SVGElement + + var elRect = el.getBoundingClientRect ? el.getBoundingClientRect() : null + var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isSvg ? {} : { width: isBody ? $(window).width() : $element.outerWidth(), height: isBody ? $(window).height() : $element.outerHeight() - }, isBody ? { top: 0, left: 0 } : $element.offset()) + } + + return $.extend({}, elRect, scroll, outerDims, elOffset) } Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { diff --git a/assets/stylesheets/bootstrap/_button-groups.scss b/assets/stylesheets/bootstrap/_button-groups.scss index 63ccd92..e201a74 100644 --- a/assets/stylesheets/bootstrap/_button-groups.scss +++ b/assets/stylesheets/bootstrap/_button-groups.scss @@ -232,9 +232,14 @@ // // See https://github.com/twbs/bootstrap/pull/12794 for more. -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - position: absolute; - z-index: -1; - @include opacity(0); +[data-toggle="buttons"] { + > .btn, + > .btn-group > .btn { + input[type="radio"], + input[type="checkbox"] { + position: absolute; + z-index: -1; + @include opacity(0); + } + } } diff --git a/assets/stylesheets/bootstrap/_buttons.scss b/assets/stylesheets/bootstrap/_buttons.scss index dae6ee3..a27aa8d 100644 --- a/assets/stylesheets/bootstrap/_buttons.scss +++ b/assets/stylesheets/bootstrap/_buttons.scss @@ -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 { @include tab-focus(); } } &:hover, - &:focus { + &:focus, + &.focus { color: $btn-default-color; text-decoration: none; } @@ -85,7 +88,6 @@ .btn-link { color: $link-color; font-weight: normal; - cursor: pointer; border-radius: 0; &, diff --git a/assets/stylesheets/bootstrap/_forms.scss b/assets/stylesheets/bootstrap/_forms.scss index 74bb67d..ff008a8 100644 --- a/assets/stylesheets/bootstrap/_forms.scss +++ b/assets/stylesheets/bootstrap/_forms.scss @@ -210,11 +210,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; @@ -308,9 +308,9 @@ input[type="checkbox"] { // Build on `.form-control` with modifier classes to decrease or increase the // height and font-size of form controls. -@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small); +@include input-size('.input-sm, .form-group-sm .form-control', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small); -@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large); +@include input-size('.input-lg, .form-group-lg .form-control', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large); // Form control feedback states @@ -329,7 +329,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; @@ -360,10 +360,15 @@ input[type="checkbox"] { @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg); } +// Reposition feedback icon if input has visible label above +.has-feedback label { -// 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; + } } @@ -380,7 +385,6 @@ input[type="checkbox"] { } - // Inline forms // // Make forms appear inline(-block) by adding the `.form-inline` class. Inline @@ -451,10 +455,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; } @@ -507,7 +508,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); } @@ -521,9 +521,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) { @@ -531,8 +528,5 @@ input[type="checkbox"] { padding-top: ($padding-small-vertical + 1); } } - .form-control { - @extend .input-sm; - } } } diff --git a/assets/stylesheets/bootstrap/_navbar.scss b/assets/stylesheets/bootstrap/_navbar.scss index 3b94d6f..907610c 100644 --- a/assets/stylesheets/bootstrap/_navbar.scss +++ b/assets/stylesheets/bootstrap/_navbar.scss @@ -92,7 +92,7 @@ .navbar-collapse { max-height: $navbar-collapse-max-height; - @media (max-width: $screen-xs-min) and (orientation: landscape) { + @media (max-device-width: $screen-xs-min) and (orientation: landscape) { max-height: 200px; } } @@ -173,6 +173,10 @@ text-decoration: none; } + > img { + display: block; + } + @media (min-width: $grid-float-breakpoint) { .navbar > .container &, .navbar > .container-fluid & { @@ -271,26 +275,6 @@ padding-bottom: $navbar-padding-vertical; } } - - &.navbar-right:last-child { - margin-right: -$navbar-padding-horizontal; - } - } -} - - -// Component alignment -// -// Repurpose the pull utilities as their own navbar utilities to avoid specificity -// issues with parents and chaining. Only do this when the navbar is uncollapsed -// though so that navbar contents properly stack and align in mobile. - -@media (min-width: $grid-float-breakpoint) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; } } @@ -330,11 +314,6 @@ padding-top: 0; padding-bottom: 0; @include box-shadow(none); - - // Outdent the form if last child to line up with content down the page - &.navbar-right:last-child { - margin-right: -$navbar-padding-horizontal; - } } } @@ -379,14 +358,33 @@ float: left; margin-left: $navbar-padding-horizontal; margin-right: $navbar-padding-horizontal; + } +} + - // Outdent the form if last child to line up with content down the page - &.navbar-right:last-child { +// Component alignment +// +// Repurpose the pull utilities as their own navbar utilities to avoid specificity +// issues with parents and chaining. Only do this when the navbar is uncollapsed +// though so that navbar contents properly stack and align in mobile. +// +// Declared after the navbar components to ensure more specificity on the margins. + +@media (min-width: $grid-float-breakpoint) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -$navbar-padding-horizontal; + + ~ .navbar-right { margin-right: 0; } } } + // Alternate navbars // -------------------------------------------------- diff --git a/assets/stylesheets/bootstrap/_progress-bars.scss b/assets/stylesheets/bootstrap/_progress-bars.scss index 6395ac2..0fe8100 100644 --- a/assets/stylesheets/bootstrap/_progress-bars.scss +++ b/assets/stylesheets/bootstrap/_progress-bars.scss @@ -69,11 +69,6 @@ // Account for lower percentages .progress-bar { - &[aria-valuenow="1"], - &[aria-valuenow="2"] { - min-width: 30px; - } - &[aria-valuenow="0"] { color: $gray-light; min-width: 30px; diff --git a/assets/stylesheets/bootstrap/_tables.scss b/assets/stylesheets/bootstrap/_tables.scss index 7c5d5bb..be88fc4 100644 --- a/assets/stylesheets/bootstrap/_tables.scss +++ b/assets/stylesheets/bootstrap/_tables.scss @@ -106,10 +106,7 @@ th { .table-striped { > tbody > tr:nth-child(odd) { - > td, - > th { - background-color: $table-bg-accent; - } + background-color: $table-bg-accent; } } @@ -120,10 +117,7 @@ th { .table-hover { > tbody > tr:hover { - > td, - > th { - background-color: $table-bg-hover; - } + background-color: $table-bg-hover; } } diff --git a/assets/stylesheets/bootstrap/_type.scss b/assets/stylesheets/bootstrap/_type.scss index 3f21b21..f8c34ce 100644 --- a/assets/stylesheets/bootstrap/_type.scss +++ b/assets/stylesheets/bootstrap/_type.scss @@ -80,11 +80,6 @@ small, font-size: floor((100% * $font-size-small / $font-size-base)); } -// Undo browser default styling -cite { - font-style: normal; -} - mark, .mark { background-color: $state-warning-bg; diff --git a/assets/stylesheets/bootstrap/_variables.scss b/assets/stylesheets/bootstrap/_variables.scss index 1abd52e..8cdc824 100644 --- a/assets/stylesheets/bootstrap/_variables.scss +++ b/assets/stylesheets/bootstrap/_variables.scss @@ -12,11 +12,12 @@ $bootstrap-sass-asset-helper: (twbs-font-path("") != unquote('twbs-font-path("") // //## Gray and brand colors for use across Bootstrap. -$gray-darker: lighten(#000, 13.5%) !default; // #222 -$gray-dark: lighten(#000, 20%) !default; // #333 -$gray: lighten(#000, 33.5%) !default; // #555 -$gray-light: lighten(#000, 46.7%) !default; // #777 -$gray-lighter: lighten(#000, 93.5%) !default; // #eee +$gray-base: #000 !default; +$gray-darker: lighten($gray-base, 13.5%) !default; // #222 +$gray-dark: lighten($gray-base, 20%) !default; // #333 +$gray: lighten($gray-base, 33.5%) !default; // #555 +$gray-light: lighten($gray-base, 46.7%) !default; // #777 +$gray-lighter: lighten($gray-base, 93.5%) !default; // #eee $brand-primary: #428bca !default; $brand-success: #5cb85c !default; @@ -376,7 +377,7 @@ $navbar-default-toggle-border-color: #ddd !default; // Inverted navbar // Reset inverted navbar basics -$navbar-inverse-color: $gray-light !default; +$navbar-inverse-color: lighten($gray-light, 12%) !default; $navbar-inverse-bg: #222 !default; $navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default; diff --git a/assets/stylesheets/bootstrap/mixins/_buttons.scss b/assets/stylesheets/bootstrap/mixins/_buttons.scss index 58ad13e..74a4ffc 100644 --- a/assets/stylesheets/bootstrap/mixins/_buttons.scss +++ b/assets/stylesheets/bootstrap/mixins/_buttons.scss @@ -10,6 +10,7 @@ &:hover, &:focus, + &.focus, &:active, &.active, .open > &.dropdown-toggle { @@ -28,6 +29,7 @@ &, &:hover, &:focus, + &.focus, &:active, &.active { background-color: $background; diff --git a/assets/stylesheets/bootstrap/mixins/_forms.scss b/assets/stylesheets/bootstrap/mixins/_forms.scss index ff72f0e..277aa5f 100644 --- a/assets/stylesheets/bootstrap/mixins/_forms.scss +++ b/assets/stylesheets/bootstrap/mixins/_forms.scss @@ -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 diff --git a/assets/stylesheets/bootstrap/mixins/_image.scss b/assets/stylesheets/bootstrap/mixins/_image.scss index 57d60a3..c8dcf5e 100644 --- a/assets/stylesheets/bootstrap/mixins/_image.scss +++ b/assets/stylesheets/bootstrap/mixins/_image.scss @@ -8,7 +8,6 @@ // Keep images from scaling beyond the width of their parents. @mixin 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 } diff --git a/lib/bootstrap-sass/version.rb b/lib/bootstrap-sass/version.rb index c805643..58dd9ef 100644 --- a/lib/bootstrap-sass/version.rb +++ b/lib/bootstrap-sass/version.rb @@ -1,4 +1,4 @@ module Bootstrap VERSION = '3.2.0.0' - BOOTSTRAP_SHA = '1098453f831fad3fdfcbf036237ed064a5d29b26' + BOOTSTRAP_SHA = 'c3ae289f4a9e5fc14e489e3914d150954469f1ac' end |