Commit d1872b4c authored by Mark Otto's avatar Mark Otto
Browse files

Merge branch 'master' into pr/13736

Conflicts:
	dist/css/bootstrap.css.map
	dist/css/bootstrap.min.css
parents 5872a7e0 5cd72ce2
Showing with 156 additions and 112 deletions
+156 -112
...@@ -53,6 +53,9 @@ module.exports = function (grunt) { ...@@ -53,6 +53,9 @@ module.exports = function (grunt) {
src: 'js/*.js' src: 'js/*.js'
}, },
test: { test: {
options: {
jshintrc: 'js/tests/unit/.jshintrc'
},
src: 'js/tests/unit/*.js' src: 'js/tests/unit/*.js'
}, },
assets: { assets: {
...@@ -65,10 +68,6 @@ module.exports = function (grunt) { ...@@ -65,10 +68,6 @@ module.exports = function (grunt) {
config: 'js/.jscsrc' config: 'js/.jscsrc'
}, },
grunt: { grunt: {
options: {
requireCamelCaseOrUpperCaseIdentifiers: null,
requireParenthesesAroundIIFE: true
},
src: '<%= jshint.grunt.src %>' src: '<%= jshint.grunt.src %>'
}, },
src: { src: {
...@@ -233,7 +232,7 @@ module.exports = function (grunt) { ...@@ -233,7 +232,7 @@ module.exports = function (grunt) {
core: { core: {
files: { files: {
'dist/css/<%= pkg.name %>.min.css': 'dist/css/<%= pkg.name %>.css', 'dist/css/<%= pkg.name %>.min.css': 'dist/css/<%= pkg.name %>.css',
'dist/css/<%= pkg.name %>-theme.min.css': 'dist/css/<%= pkg.name %>-theme.css', 'dist/css/<%= pkg.name %>-theme.min.css': 'dist/css/<%= pkg.name %>-theme.css'
} }
}, },
docs: { docs: {
...@@ -315,9 +314,9 @@ module.exports = function (grunt) { ...@@ -315,9 +314,9 @@ module.exports = function (grunt) {
pretty: true, pretty: true,
data: function () { data: function () {
var filePath = path.join(__dirname, 'less/variables.less'); var filePath = path.join(__dirname, 'less/variables.less');
var fileContent = fs.readFileSync(filePath, {encoding: 'utf8'}); var fileContent = fs.readFileSync(filePath, { encoding: 'utf8' });
var parser = new BsLessdocParser(fileContent); var parser = new BsLessdocParser(fileContent);
return {sections: parser.parseFile()}; return { sections: parser.parseFile() };
} }
}, },
files: { files: {
...@@ -392,7 +391,7 @@ module.exports = function (grunt) { ...@@ -392,7 +391,7 @@ module.exports = function (grunt) {
// These plugins provide necessary tasks. // These plugins provide necessary tasks.
require('load-grunt-tasks')(grunt, {scope: 'devDependencies'}); require('load-grunt-tasks')(grunt, { scope: 'devDependencies' });
require('time-grunt')(grunt); require('time-grunt')(grunt);
// Docs HTML validation task // Docs HTML validation task
......
...@@ -14,7 +14,7 @@ To get started, check out <http://getbootstrap.com>! ...@@ -14,7 +14,7 @@ To get started, check out <http://getbootstrap.com>!
- [Contributing](#contributing) - [Contributing](#contributing)
- [Community](#community) - [Community](#community)
- [Versioning](#versioning) - [Versioning](#versioning)
- [Authors](#authors) - [Creators](#creators)
- [Copyright and license](#copyright-and-license) - [Copyright and license](#copyright-and-license)
## Quick start ## Quick start
...@@ -134,22 +134,9 @@ Keep track of development and community news. ...@@ -134,22 +134,9 @@ Keep track of development and community news.
## Versioning ## Versioning
For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under the Semantic Versioning guidelines. Sometimes we screw up, but we'll adhere to these rules whenever possible. For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under [the Semantic Versioning guidelines](http://semver.org/). Sometimes we screw up, but we'll adhere to those rules whenever possible.
Releases will be numbered with the following format:
`<major>.<minor>.<patch>`
And constructed with the following guidelines:
- Breaking backward compatibility **bumps the major** while resetting minor and patch
- New additions without breaking backward compatibility **bumps the minor** while resetting the patch
- Bug fixes and misc changes **bumps only the patch**
For more information on SemVer, please visit <http://semver.org/>.
......
...@@ -30,5 +30,8 @@ ...@@ -30,5 +30,8 @@
"branch-alias": { "branch-alias": {
"dev-master": "3.1.x-dev" "dev-master": "3.1.x-dev"
} }
},
"replace": {
"twitter/bootstrap": "self.version"
} }
} }
...@@ -2440,18 +2440,24 @@ input[type="month"].input-lg { ...@@ -2440,18 +2440,24 @@ input[type="month"].input-lg {
} }
input[type="radio"][disabled], input[type="radio"][disabled],
input[type="checkbox"][disabled], input[type="checkbox"][disabled],
.radio[disabled], input[type="radio"].disabled,
.radio-inline[disabled], input[type="checkbox"].disabled,
.checkbox[disabled],
.checkbox-inline[disabled],
fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="radio"],
fieldset[disabled] input[type="checkbox"], fieldset[disabled] input[type="checkbox"] {
fieldset[disabled] .radio, cursor: not-allowed;
}
.radio-inline.disabled,
.checkbox-inline.disabled,
fieldset[disabled] .radio-inline, fieldset[disabled] .radio-inline,
fieldset[disabled] .checkbox,
fieldset[disabled] .checkbox-inline { fieldset[disabled] .checkbox-inline {
cursor: not-allowed; cursor: not-allowed;
} }
.radio.disabled label,
.checkbox.disabled label,
fieldset[disabled] .radio label,
fieldset[disabled] .checkbox label {
cursor: not-allowed;
}
.input-sm { .input-sm {
height: 30px; height: 30px;
padding: 5px 10px; padding: 5px 10px;
...@@ -3816,6 +3822,9 @@ select[multiple].input-group-sm > .input-group-btn > .btn { ...@@ -3816,6 +3822,9 @@ select[multiple].input-group-sm > .input-group-btn > .btn {
right: 0; right: 0;
left: 0; left: 0;
z-index: 1030; z-index: 1030;
-webkit-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
} }
@media (min-width: 768px) { @media (min-width: 768px) {
.navbar-fixed-top, .navbar-fixed-top,
...@@ -5127,7 +5136,7 @@ a.list-group-item-danger.active:focus { ...@@ -5127,7 +5136,7 @@ a.list-group-item-danger.active:focus {
.panel-group .panel-heading { .panel-group .panel-heading {
border-bottom: 0; border-bottom: 0;
} }
.panel-group .panel-heading + .panel-collapse .panel-body { .panel-group .panel-heading + .panel-collapse > .panel-body {
border-top: 1px solid #ddd; border-top: 1px solid #ddd;
} }
.panel-group .panel-footer { .panel-group .panel-footer {
...@@ -5312,16 +5321,14 @@ button.close { ...@@ -5312,16 +5321,14 @@ button.close {
-webkit-transition: -webkit-transform .3s ease-out; -webkit-transition: -webkit-transform .3s ease-out;
-o-transition: -o-transform .3s ease-out; -o-transition: -o-transform .3s ease-out;
transition: transform .3s ease-out; transition: transform .3s ease-out;
-webkit-transform: translate(0, -25%); -webkit-transform: translate3d(0, -25%, 0);
-ms-transform: translate(0, -25%); -o-transform: translate3d(0, -25%, 0);
-o-transform: translate(0, -25%); transform: translate3d(0, -25%, 0);
transform: translate(0, -25%);
} }
.modal.in .modal-dialog { .modal.in .modal-dialog {
-webkit-transform: translate(0, 0); -webkit-transform: translate3d(0, 0, 0);
-ms-transform: translate(0, 0); -o-transform: translate3d(0, 0, 0);
-o-transform: translate(0, 0); transform: translate3d(0, 0, 0);
transform: translate(0, 0);
} }
.modal-dialog { .modal-dialog {
position: relative; position: relative;
...@@ -5907,6 +5914,9 @@ button.close { ...@@ -5907,6 +5914,9 @@ button.close {
} }
.affix { .affix {
position: fixed; position: fixed;
-webkit-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
} }
@-ms-viewport { @-ms-viewport {
width: device-width; width: device-width;
......
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -42,7 +42,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -42,7 +42,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
// http://blog.alexmaccaw.com/css-transitions // http://blog.alexmaccaw.com/css-transitions
$.fn.emulateTransitionEnd = function (duration) { $.fn.emulateTransitionEnd = function (duration) {
var called = false, $el = this var called = false
var $el = this
$(this).one($.support.transition.end, function () { called = true }) $(this).one($.support.transition.end, function () { called = true })
var callback = function () { if (!called) $($el).trigger($.support.transition.end) } var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
setTimeout(callback, duration) setTimeout(callback, duration)
...@@ -297,7 +298,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -297,7 +298,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
wrap: true wrap: true
} }
Carousel.prototype.cycle = function (e) { Carousel.prototype.cycle = function (e) {
e || (this.paused = false) e || (this.paused = false)
this.interval && clearInterval(this.interval) this.interval && clearInterval(this.interval)
...@@ -364,10 +365,13 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -364,10 +365,13 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
$next = this.$element.find('.item')[fallback]() $next = this.$element.find('.item')[fallback]()
} }
if ($next.hasClass('active')) return this.sliding = false if ($next.hasClass('active')) return (this.sliding = false)
var relatedTarget = $next[0] var relatedTarget = $next[0]
var slideEvent = $.Event('slide.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) var slideEvent = $.Event('slide.bs.carousel', {
relatedTarget: relatedTarget,
direction: direction
})
this.$element.trigger(slideEvent) this.$element.trigger(slideEvent)
if (slideEvent.isDefaultPrevented()) return if (slideEvent.isDefaultPrevented()) return
...@@ -394,7 +398,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -394,7 +398,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
$next.removeClass([type, direction].join(' ')).addClass('active') $next.removeClass([type, direction].join(' ')).addClass('active')
$active.removeClass(['active', direction].join(' ')) $active.removeClass(['active', direction].join(' '))
that.sliding = false that.sliding = false
setTimeout(function () { that.$element.trigger(slidEvent) }, 0) setTimeout(function () {
that.$element.trigger(slidEvent)
}, 0)
}) })
.emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
} else { } else {
...@@ -446,7 +452,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -446,7 +452,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
// ================= // =================
$(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
var $this = $(this), href var href
var $this = $(this)
var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
var options = $.extend({}, $target.data(), $this.data()) var options = $.extend({}, $target.data(), $this.data())
var slideIndex = $this.attr('data-slide-to') var slideIndex = $this.attr('data-slide-to')
...@@ -454,7 +461,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -454,7 +461,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
Plugin.call($target, options) Plugin.call($target, options)
if (slideIndex = $this.attr('data-slide-to')) { if (slideIndex) {
$target.data('bs.carousel').to(slideIndex) $target.data('bs.carousel').to(slideIndex)
} }
...@@ -631,7 +638,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -631,7 +638,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
// ================= // =================
$(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
var $this = $(this), href var href
var $this = $(this)
var target = $this.attr('data-target') var target = $this.attr('data-target')
|| e.preventDefault() || e.preventDefault()
|| (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
...@@ -993,7 +1001,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -993,7 +1001,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
} else if (!this.isShown && this.$backdrop) { } else if (!this.isShown && this.$backdrop) {
this.$backdrop.removeClass('in') this.$backdrop.removeClass('in')
var callbackRemove = function() { var callbackRemove = function () {
that.removeBackdrop() that.removeBackdrop()
callback && callback() callback && callback()
} }
...@@ -1013,8 +1021,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1013,8 +1021,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar() this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar()
} }
Modal.prototype.setScrollbar = function () { Modal.prototype.setScrollbar = function () {
var bodyPad = parseInt(this.$body.css('padding-right') || 0) var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
} }
...@@ -1073,10 +1081,13 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1073,10 +1081,13 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
if ($this.is('a')) e.preventDefault() if ($this.is('a')) e.preventDefault()
Plugin.call($target, option, this) $target.one('show.bs.modal', function (showEvent) {
$target.one('hide.bs.modal', function () { if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
$this.is(':visible') && $this.trigger('focus') $target.one('hidden.bs.modal', function () {
$this.is(':visible') && $this.trigger('focus')
})
}) })
Plugin.call($target, option, this)
}) })
}(jQuery); }(jQuery);
...@@ -1228,8 +1239,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1228,8 +1239,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
if (this.hasContent() && this.enabled) { if (this.hasContent() && this.enabled) {
this.$element.trigger(e) this.$element.trigger(e)
if (e.isDefaultPrevented()) return var inDom = $.contains(document.documentElement, this.$element[0])
var that = this; if (e.isDefaultPrevented() || !inDom) return
var that = this
var $tip = this.tip() var $tip = this.tip()
...@@ -1282,7 +1294,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1282,7 +1294,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
this.applyPlacement(calculatedOffset, placement) this.applyPlacement(calculatedOffset, placement)
this.hoverState = null this.hoverState = null
var complete = function() { var complete = function () {
that.$element.trigger('shown.bs.' + that.type) that.$element.trigger('shown.bs.' + that.type)
} }
...@@ -1387,7 +1399,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1387,7 +1399,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
Tooltip.prototype.fixTitle = function () { Tooltip.prototype.fixTitle = function () {
var $e = this.$element var $e = this.$element
if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
$e.attr('data-original-title', $e.attr('title') || '').attr('title', '') $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
} }
} }
...@@ -1404,7 +1416,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1404,7 +1416,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(), scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(),
width: isBody ? $(window).width() : $element.outerWidth(), width: isBody ? $(window).width() : $element.outerWidth(),
height: isBody ? $(window).height() : $element.outerHeight() height: isBody ? $(window).height() : $element.outerHeight()
}, isBody ? {top: 0, left: 0} : $element.offset()) }, isBody ? { top: 0, left: 0 } : $element.offset())
} }
Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
...@@ -1461,11 +1473,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1461,11 +1473,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
} }
Tooltip.prototype.tip = function () { Tooltip.prototype.tip = function () {
return this.$tip = this.$tip || $(this.options.template) return (this.$tip = this.$tip || $(this.options.template))
} }
Tooltip.prototype.arrow = function () { Tooltip.prototype.arrow = function () {
return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow') return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
} }
Tooltip.prototype.validate = function () { Tooltip.prototype.validate = function () {
...@@ -1612,7 +1624,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1612,7 +1624,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
} }
Popover.prototype.arrow = function () { Popover.prototype.arrow = function () {
return this.$arrow = this.$arrow || this.tip().find('.arrow') return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
} }
Popover.prototype.tip = function () { Popover.prototype.tip = function () {
...@@ -1668,20 +1680,17 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1668,20 +1680,17 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
// ========================== // ==========================
function ScrollSpy(element, options) { function ScrollSpy(element, options) {
var href
var process = $.proxy(this.process, this) var process = $.proxy(this.process, this)
this.$element = $(element).is('body') ? $(window) : $(element)
this.$body = $('body') this.$body = $('body')
this.$scrollElement = this.$element.on('scroll.bs.scrollspy', process) this.$scrollElement = $(element).is('body') ? $(window) : $(element)
this.options = $.extend({}, ScrollSpy.DEFAULTS, options) this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
this.selector = (this.options.target this.selector = (this.options.target || '') + ' .nav li > a'
|| ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 this.offsets = []
|| '') + ' .nav li > a' this.targets = []
this.offsets = $([])
this.targets = $([])
this.activeTarget = null this.activeTarget = null
this.$scrollElement.on('scroll.bs.scrollspy', process)
this.refresh() this.refresh()
this.process() this.process()
} }
...@@ -1693,10 +1702,16 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1693,10 +1702,16 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
} }
ScrollSpy.prototype.refresh = function () { ScrollSpy.prototype.refresh = function () {
var offsetMethod = this.$element[0] == window ? 'offset' : 'position' var offsetMethod = 'offset'
var offsetBase = 0
this.offsets = $([]) if (!$.isWindow(this.$scrollElement[0])) {
this.targets = $([]) offsetMethod = 'position'
offsetBase = this.$scrollElement.scrollTop()
}
this.offsets = []
this.targets = []
var self = this var self = this
...@@ -1711,7 +1726,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1711,7 +1726,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
return ($href return ($href
&& $href.length && $href.length
&& $href.is(':visible') && $href.is(':visible')
&& [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null && [[$href[offsetMethod]().top + offsetBase, href]]) || null
}) })
.sort(function (a, b) { return a[0] - b[0] }) .sort(function (a, b) { return a[0] - b[0] })
.each(function () { .each(function () {
...@@ -1730,7 +1745,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1730,7 +1745,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
var i var i
if (scrollTop >= maxScroll) { if (scrollTop >= maxScroll) {
return activeTarget != (i = targets.last()[0]) && this.activate(i) return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
} }
if (activeTarget && scrollTop <= offsets[0]) { if (activeTarget && scrollTop <= offsets[0]) {
...@@ -1741,7 +1756,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1741,7 +1756,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
activeTarget != targets[i] activeTarget != targets[i]
&& scrollTop >= offsets[i] && scrollTop >= offsets[i]
&& (!offsets[i + 1] || scrollTop <= offsets[i + 1]) && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
&& this.activate( targets[i] ) && this.activate(targets[i])
} }
} }
...@@ -1905,7 +1920,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -1905,7 +1920,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
// TAB PLUGIN DEFINITION // TAB PLUGIN DEFINITION
// ===================== // =====================
function Plugin( option ) { function Plugin(option) {
return this.each(function () { return this.each(function () {
var $this = $(this) var $this = $(this)
var data = $this.data('bs.tab') var data = $this.data('bs.tab')
...@@ -2028,7 +2043,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re ...@@ -2028,7 +2043,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re
.trigger($.Event(affixType.replace('affix', 'affixed'))) .trigger($.Event(affixType.replace('affix', 'affixed')))
if (affix == 'bottom') { if (affix == 'bottom') {
this.$element.offset({ top: scrollHeight - this.$element.height() - offsetBottom }) this.$element.offset({
top: scrollHeight - this.$element.height() - offsetBottom
})
} }
} }
......
This diff is collapsed.
...@@ -207,7 +207,8 @@ ...@@ -207,7 +207,8 @@
{% endhighlight %} {% endhighlight %}
<h3>Checkboxes and radios</h3> <h3>Checkboxes and radios</h3>
<p>Checkboxes are for selecting one or several options in a list while radios are for selecting one option from many.</p> <p>Checkboxes are for selecting one or several options in a list, while radios are for selecting one option from many.</p>
<p>A checkbox or radio with the <code>disabled</code> attribute will be styled appropriately. To have the <code>&lt;label&gt;</code> for the checkbox or radio also display a "not-allowed" cursor when the user hovers over the label, add the <code>.disabled</code> class to your <code>.radio</code>, <code>.radio-inline</code>, <code>.checkbox</code>, <code>.checkbox-inline</code>, or <code>&lt;fieldset&gt;</code>.</p>
<h4>Default (stacked)</h4> <h4>Default (stacked)</h4>
<div class="bs-example"> <div class="bs-example">
<form role="form"> <form role="form">
...@@ -217,6 +218,12 @@ ...@@ -217,6 +218,12 @@
Option one is this and that&mdash;be sure to include why it's great Option one is this and that&mdash;be sure to include why it's great
</label> </label>
</div> </div>
<div class="checkbox disabled">
<label>
<input type="checkbox" value="" disabled>
Option two is disabled
</label>
</div>
<br> <br>
<div class="radio"> <div class="radio">
<label> <label>
...@@ -230,6 +237,12 @@ ...@@ -230,6 +237,12 @@
Option two can be something else and selecting it will deselect option one Option two can be something else and selecting it will deselect option one
</label> </label>
</div> </div>
<div class="radio disabled">
<label>
<input type="radio" name="optionsRadios" id="optionsRadios3" value="option3" disabled>
Option three is disabled
</label>
</div>
</form> </form>
</div><!-- /.bs-example --> </div><!-- /.bs-example -->
{% highlight html %} {% highlight html %}
...@@ -239,6 +252,12 @@ ...@@ -239,6 +252,12 @@
Option one is this and that&mdash;be sure to include why it's great Option one is this and that&mdash;be sure to include why it's great
</label> </label>
</div> </div>
<div class="checkbox disabled">
<label>
<input type="checkbox" value="" disabled>
Option two is disabled
</label>
</div>
<div class="radio"> <div class="radio">
<label> <label>
...@@ -252,6 +271,12 @@ ...@@ -252,6 +271,12 @@
Option two can be something else and selecting it will deselect option one Option two can be something else and selecting it will deselect option one
</label> </label>
</div> </div>
<div class="radio disabled">
<label>
<input type="radio" name="optionsRadios" id="optionsRadios3" value="option3" disabled>
Option three is disabled
</label>
</div>
{% endhighlight %} {% endhighlight %}
<h4>Inline checkboxes and radios</h4> <h4>Inline checkboxes and radios</h4>
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
!function ($) { !function ($) {
'use strict';
$(function () { $(function () {
......
...@@ -6,7 +6,10 @@ ...@@ -6,7 +6,10 @@
* details, see http://creativecommons.org/licenses/by/3.0/. * details, see http://creativecommons.org/licenses/by/3.0/.
*/ */
/* global JSZip, less, saveAs, UglifyJS, __js, __less, __fonts */
window.onload = function () { // wait for load in a dumb way because B-0 window.onload = function () { // wait for load in a dumb way because B-0
'use strict';
var cw = '/*!\n' + var cw = '/*!\n' +
' * Bootstrap v3.1.1 (http://getbootstrap.com)\n' + ' * Bootstrap v3.1.1 (http://getbootstrap.com)\n' +
' * Copyright 2011-2014 Twitter, Inc.\n' + ' * Copyright 2011-2014 Twitter, Inc.\n' +
...@@ -24,6 +27,12 @@ window.onload = function () { // wait for load in a dumb way because B-0 ...@@ -24,6 +27,12 @@ window.onload = function () { // wait for load in a dumb way because B-0
throw err throw err
} }
function showSuccess(msg) {
$('<div class="bs-callout bs-callout-info">' +
'<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>' + msg +
'</div>').insertAfter('.bs-customize-download')
}
function showCallout(msg, showUpTop) { function showCallout(msg, showUpTop) {
var callout = $('<div class="bs-callout bs-callout-danger">' + var callout = $('<div class="bs-callout bs-callout-danger">' +
'<h4>Attention!</h4>' + '<h4>Attention!</h4>' +
...@@ -60,16 +69,18 @@ window.onload = function () { // wait for load in a dumb way because B-0 ...@@ -60,16 +69,18 @@ window.onload = function () { // wait for load in a dumb way because B-0
data: JSON.stringify(data) data: JSON.stringify(data)
}) })
.success(function (result) { .success(function (result) {
var gistUrl = result.html_url;
var origin = window.location.protocol + '//' + window.location.host var origin = window.location.protocol + '//' + window.location.host
var newUrl = origin + window.location.pathname + '?id=' + result.id var customizerUrl = origin + window.location.pathname + '?id=' + result.id
history.replaceState(false, document.title, newUrl) showSuccess('<strong>Success!</strong> Your configuration has been saved to <a href="' + gistUrl + '">' + gistUrl + '</a> ' +
callback(result.html_url, newUrl) 'and can be revisited here at <a href="' + customizerUrl + '">' + customizerUrl + '</a> for further customization.')
history.replaceState(false, document.title, customizerUrl)
callback(gistUrl, customizerUrl)
}) })
.error(function (err) { .error(function (err) {
try { try {
showError('<strong>Ruh roh!</strong> Could not save gist file, configuration not saved.', err) showError('<strong>Ruh roh!</strong> Could not save gist file, configuration not saved.', err)
} } catch (sameErr) {
catch (sameErr) {
// deliberately ignore the error // deliberately ignore the error
} }
callback('<none>', '<none>') callback('<none>', '<none>')
...@@ -150,7 +161,7 @@ window.onload = function () { // wait for load in a dumb way because B-0 ...@@ -150,7 +161,7 @@ window.onload = function () { // wait for load in a dumb way because B-0
if (fonts) { if (fonts) {
var fontsFolder = zip.folder('fonts') var fontsFolder = zip.folder('fonts')
for (var fontsFileName in fonts) { for (var fontsFileName in fonts) {
fontsFolder.file(fontsFileName, fonts[fontsFileName], {base64: true}) fontsFolder.file(fontsFileName, fonts[fontsFileName], { base64: true })
} }
} }
...@@ -208,7 +219,7 @@ window.onload = function () { // wait for load in a dumb way because B-0 ...@@ -208,7 +219,7 @@ window.onload = function () { // wait for load in a dumb way because B-0
var lessSource = __less[lessFilename] var lessSource = __less[lessFilename]
var lessFilenames = includedLessFilenames(lessFilename) var lessFilenames = includedLessFilenames(lessFilename)
$.each(lessFilenames, function(index, filename) { $.each(lessFilenames, function (index, filename) {
var fileInclude = lessFileIncludes[filename] var fileInclude = lessFileIncludes[filename]
// Files not explicitly unchecked are compiled into the final stylesheet. // Files not explicitly unchecked are compiled into the final stylesheet.
...@@ -245,7 +256,7 @@ window.onload = function () { // wait for load in a dumb way because B-0 ...@@ -245,7 +256,7 @@ window.onload = function () { // wait for load in a dumb way because B-0
function generateCSS(preamble) { function generateCSS(preamble) {
var oneChecked = false var oneChecked = false
var lessFileIncludes = {} var lessFileIncludes = {}
$('#less-section input').each(function() { $('#less-section input').each(function () {
var $this = $(this) var $this = $(this)
var checked = $this.is(':checked') var checked = $this.is(':checked')
lessFileIncludes[$this.val()] = checked lessFileIncludes[$this.val()] = checked
...@@ -396,7 +407,7 @@ window.onload = function () { // wait for load in a dumb way because B-0 ...@@ -396,7 +407,7 @@ window.onload = function () { // wait for load in a dumb way because B-0
var url = window.webkitURL || window.URL // Safari 6 uses "webkitURL". var url = window.webkitURL || window.URL // Safari 6 uses "webkitURL".
var svg = new Blob( var svg = new Blob(
['<svg xmlns=\'http://www.w3.org/2000/svg\'></svg>'], ['<svg xmlns=\'http://www.w3.org/2000/svg\'></svg>'],
{type: 'image/svg+xml;charset=utf-8'} { type: 'image/svg+xml;charset=utf-8' }
) )
var objectUrl = url.createObjectURL(svg); var objectUrl = url.createObjectURL(svg);
if (/^blob:/.exec(objectUrl) === null) { if (/^blob:/.exec(objectUrl) === null) {
...@@ -404,8 +415,7 @@ window.onload = function () { // wait for load in a dumb way because B-0 ...@@ -404,8 +415,7 @@ window.onload = function () { // wait for load in a dumb way because B-0
// than "blob:", which means it has been polyfilled and is not supported by // than "blob:", which means it has been polyfilled and is not supported by
// this browser. // this browser.
failback() failback()
} } else {
else {
$('<img>') $('<img>')
.on('load', function () { .on('load', function () {
$compileBtn.prop('disabled', false) $compileBtn.prop('disabled', false)
......
This diff is collapsed.
...@@ -13,4 +13,4 @@ var Holder=Holder||{};!function(a,b){function c(a,b,c){b=parseInt(b,10),a=parseI ...@@ -13,4 +13,4 @@ var Holder=Holder||{};!function(a,b){function c(a,b,c){b=parseInt(b,10),a=parseI
* Licensed under the Creative Commons Attribution 3.0 Unported License. For * Licensed under the Creative Commons Attribution 3.0 Unported License. For
* details, see http://creativecommons.org/licenses/by/3.0/. * details, see http://creativecommons.org/licenses/by/3.0/.
*/ */
!function(a){a(function(){var b=a(window),c=a(document.body);c.scrollspy({target:".bs-docs-sidebar"}),b.on("load",function(){c.scrollspy("refresh")}),a(".bs-docs-container [href=#]").click(function(a){a.preventDefault()}),setTimeout(function(){var b=a(".bs-docs-sidebar");b.affix({offset:{top:function(){var c=b.offset().top,d=parseInt(b.children(0).css("margin-top"),10),e=a(".bs-docs-nav").height();return this.top=c-e-d},bottom:function(){return this.bottom=a(".bs-docs-footer").outerHeight(!0)}}})},100),setTimeout(function(){a(".bs-top").affix()},100),function(){var b=a("#bs-theme-stylesheet"),c=a(".bs-docs-theme-toggle");c.click(function(){var a=b.attr("href");a&&0!==a.indexOf("data")?(b.attr("href",""),c.text("Preview theme")):(b.attr("href",b.attr("data-href")),c.text("Disable theme preview"))})}(),a(".tooltip-demo").tooltip({selector:'[data-toggle="tooltip"]',container:"body"}),a(".tooltip-test").tooltip(),a(".popover-test").popover(),a(".bs-docs-navbar").tooltip({selector:'a[data-toggle="tooltip"]',container:".bs-docs-navbar .nav"}),a(".bs-docs-popover").popover(),a(".bs-docs-popover-dismiss").popover({trigger:"focus"}),a("#loading-example-btn").click(function(){var b=a(this);b.button("loading"),setTimeout(function(){b.button("reset")},3e3)})})}(jQuery); !function(a){"use strict";a(function(){var b=a(window),c=a(document.body);c.scrollspy({target:".bs-docs-sidebar"}),b.on("load",function(){c.scrollspy("refresh")}),a(".bs-docs-container [href=#]").click(function(a){a.preventDefault()}),setTimeout(function(){var b=a(".bs-docs-sidebar");b.affix({offset:{top:function(){var c=b.offset().top,d=parseInt(b.children(0).css("margin-top"),10),e=a(".bs-docs-nav").height();return this.top=c-e-d},bottom:function(){return this.bottom=a(".bs-docs-footer").outerHeight(!0)}}})},100),setTimeout(function(){a(".bs-top").affix()},100),function(){var b=a("#bs-theme-stylesheet"),c=a(".bs-docs-theme-toggle");c.click(function(){var a=b.attr("href");a&&0!==a.indexOf("data")?(b.attr("href",""),c.text("Preview theme")):(b.attr("href",b.attr("data-href")),c.text("Disable theme preview"))})}(),a(".tooltip-demo").tooltip({selector:'[data-toggle="tooltip"]',container:"body"}),a(".tooltip-test").tooltip(),a(".popover-test").popover(),a(".bs-docs-navbar").tooltip({selector:'a[data-toggle="tooltip"]',container:".bs-docs-navbar .nav"}),a(".bs-docs-popover").popover(),a(".bs-docs-popover-dismiss").popover({trigger:"focus"}),a("#loading-example-btn").click(function(){var b=a(this);b.button("loading"),setTimeout(function(){b.button("reset")},3e3)})})}(jQuery);
\ No newline at end of file \ No newline at end of file
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
// http://getbootstrap.com/getting-started/#support-ie10-width // http://getbootstrap.com/getting-started/#support-ie10-width
(function () { (function () {
'use strict';
if (navigator.userAgent.match(/IEMobile\/10\.0/)) { if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
var msViewportStyle = document.createElement('style') var msViewportStyle = document.createElement('style')
msViewportStyle.appendChild( msViewportStyle.appendChild(
......
...@@ -9,5 +9,5 @@ ...@@ -9,5 +9,5 @@
*/ */
// Intended to prevent false-positive bug reports about responsive styling supposedly not working in IE8. // Intended to prevent false-positive bug reports about responsive styling supposedly not working in IE8.
if (window.location.protocol == 'file:') { if (window.location.protocol == 'file:') {
alert('ERROR: Bootstrap\'s responsive CSS is disabled!\nSee getbootstrap.com/getting-started/#respond-file-proto for details.') window.alert('ERROR: Bootstrap\'s responsive CSS is disabled!\nSee getbootstrap.com/getting-started/#respond-file-proto for details.')
} }
This diff is collapsed.
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
...@@ -22,7 +22,7 @@ body { ...@@ -22,7 +22,7 @@ body {
} }
/* Flip around the padding for proper display in narrow viewports */ /* Flip around the padding for proper display in narrow viewports */
.navbar-wrapper .container { .navbar-wrapper > .container {
padding-right: 0; padding-right: 0;
padding-left: 0; padding-left: 0;
} }
...@@ -30,6 +30,9 @@ body { ...@@ -30,6 +30,9 @@ body {
padding-right: 15px; padding-right: 15px;
padding-left: 15px; padding-left: 15px;
} }
.navbar-wrapper .navbar .container {
width: auto;
}
/* CUSTOMIZE THE CAROUSEL /* CUSTOMIZE THE CAROUSEL
...@@ -63,12 +66,6 @@ body { ...@@ -63,12 +66,6 @@ body {
/* MARKETING CONTENT /* MARKETING CONTENT
-------------------------------------------------- */ -------------------------------------------------- */
/* Pad the edges of the mobile views a bit */
.marketing {
padding-right: 15px;
padding-left: 15px;
}
/* Center align the text within the three columns below the carousel */ /* Center align the text within the three columns below the carousel */
.marketing .col-lg-4 { .marketing .col-lg-4 {
margin-bottom: 20px; margin-bottom: 20px;
...@@ -104,12 +101,6 @@ body { ...@@ -104,12 +101,6 @@ body {
@media (min-width: 768px) { @media (min-width: 768px) {
/* Remove the edge padding needed for mobile */
.marketing {
padding-right: 0;
padding-left: 0;
}
/* Navbar positioning foo */ /* Navbar positioning foo */
.navbar-wrapper { .navbar-wrapper {
margin-top: 20px; margin-top: 20px;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment