0
0
mirror of https://github.com/twbs/bootstrap.git synced 2025-02-21 18:54:30 +01:00

Merge branch 'master' into pr/12462

Conflicts:
	dist/css/bootstrap.css.map
	dist/css/bootstrap.min.css
	docs/dist/css/bootstrap.css.map
	docs/dist/css/bootstrap.min.css
This commit is contained in:
Mark Otto 2014-02-08 16:01:56 -08:00
commit e3cfd5821d
46 changed files with 678 additions and 462 deletions

View File

@ -26,6 +26,6 @@ env:
- TWBS_TEST=core - TWBS_TEST=core
- TWBS_TEST=validate-html - TWBS_TEST=validate-html
- TWBS_TEST=sauce-js-unit - TWBS_TEST=sauce-js-unit
- TWBS_TEST=browserstack-js-unit # - TWBS_TEST=browserstack-js-unit
matrix: matrix:
fast_finish: true fast_finish: true

View File

@ -30,7 +30,7 @@ module.exports = function (grunt) {
banner: '/*!\n' + banner: '/*!\n' +
' * Bootstrap v<%= pkg.version %> (<%= pkg.homepage %>)\n' + ' * Bootstrap v<%= pkg.version %> (<%= pkg.homepage %>)\n' +
' * Copyright 2011-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + ' * Copyright 2011-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
' * Licensed under <%= _.pluck(pkg.licenses, "type") %> (<%= _.pluck(pkg.licenses, "url") %>)\n' + ' * Licensed under <%= pkg.license.type %> (<%= pkg.license.url %>)\n' +
' */\n', ' */\n',
jqueryCheck: 'if (typeof jQuery === \'undefined\') { throw new Error(\'Bootstrap\\\'s JavaScript requires jQuery\') }\n\n', jqueryCheck: 'if (typeof jQuery === \'undefined\') { throw new Error(\'Bootstrap\\\'s JavaScript requires jQuery\') }\n\n',
@ -44,7 +44,10 @@ module.exports = function (grunt) {
jshintrc: 'js/.jshintrc' jshintrc: 'js/.jshintrc'
}, },
grunt: { grunt: {
src: ['Gruntfile.js', 'docs/grunt/*.js', 'test-infra/shrinkwrap.js'] options: {
node: true
},
src: ['Gruntfile.js', 'grunt/*.js']
}, },
src: { src: {
src: 'js/*.js' src: 'js/*.js'
@ -62,7 +65,7 @@ module.exports = function (grunt) {
config: 'js/.jscs.json', config: 'js/.jscs.json',
}, },
grunt: { grunt: {
src: ['Gruntfile.js', 'docs/grunt/*.js', 'test-infra/shrinkwrap.js'] src: ['Gruntfile.js', 'grunt/*.js']
}, },
src: { src: {
src: 'js/*.js' src: 'js/*.js'
@ -259,7 +262,7 @@ module.exports = function (grunt) {
options: { options: {
inject: 'js/tests/unit/phantom.js' inject: 'js/tests/unit/phantom.js'
}, },
files: 'js/tests/*.html' files: 'js/tests/index.html'
}, },
connect: { connect: {
@ -287,8 +290,8 @@ module.exports = function (grunt) {
} }
}, },
files: { files: {
'docs/_includes/customizer-variables.html': 'docs/customizer-variables.jade', 'docs/_includes/customizer-variables.html': 'docs/jade/customizer-variables.jade',
'docs/_includes/nav-customize.html': 'docs/customizer-nav.jade' 'docs/_includes/nav-customize.html': 'docs/jade/customizer-nav.jade'
} }
} }
}, },

View File

@ -14,7 +14,9 @@ baseurl: /
url: http://localhost:9001 url: http://localhost:9001
encoding: UTF-8 encoding: UTF-8
exclude: ["vendor"] exclude:
- "jade"
- "vendor"
# Custom vars # Custom vars
current_version: 3.1.0 current_version: 3.1.0

File diff suppressed because one or more lines are too long

130
dist/css/bootstrap.css vendored
View File

@ -307,7 +307,11 @@ figure {
img { img {
vertical-align: middle; vertical-align: middle;
} }
.img-responsive { .img-responsive,
.thumbnail > img,
.thumbnail a > img,
.carousel-inner > .item > img,
.carousel-inner > .item > a > img {
display: block; display: block;
max-width: 100%; max-width: 100%;
height: auto; height: auto;
@ -1709,9 +1713,6 @@ output {
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
} }
.form-control:-moz-placeholder {
color: #999;
}
.form-control::-moz-placeholder { .form-control::-moz-placeholder {
color: #999; color: #999;
opacity: 1; opacity: 1;
@ -1732,6 +1733,9 @@ fieldset[disabled] .form-control {
textarea.form-control { textarea.form-control {
height: auto; height: auto;
} }
input[type="search"] {
-webkit-appearance: none;
}
input[type="date"] { input[type="date"] {
line-height: 34px; line-height: 34px;
} }
@ -1935,6 +1939,9 @@ select[multiple].input-lg {
width: auto; width: auto;
vertical-align: middle; vertical-align: middle;
} }
.form-inline .input-group > .form-control {
width: 100%;
}
.form-inline .control-label { .form-inline .control-label {
margin-bottom: 0; margin-bottom: 0;
vertical-align: middle; vertical-align: middle;
@ -1999,7 +2006,6 @@ select[multiple].input-lg {
-webkit-user-select: none; -webkit-user-select: none;
-moz-user-select: none; -moz-user-select: none;
-ms-user-select: none; -ms-user-select: none;
-o-user-select: none;
user-select: none; user-select: none;
background-image: none; background-image: none;
border: 1px solid transparent; border: 1px solid transparent;
@ -2311,19 +2317,22 @@ fieldset[disabled] .btn-link:focus {
color: #999; color: #999;
text-decoration: none; text-decoration: none;
} }
.btn-lg { .btn-lg,
.btn-group-lg > .btn {
padding: 10px 16px; padding: 10px 16px;
font-size: 18px; font-size: 18px;
line-height: 1.33; line-height: 1.33;
border-radius: 6px; border-radius: 6px;
} }
.btn-sm { .btn-sm,
.btn-group-sm > .btn {
padding: 5px 10px; padding: 5px 10px;
font-size: 12px; font-size: 12px;
line-height: 1.5; line-height: 1.5;
border-radius: 3px; border-radius: 3px;
} }
.btn-xs { .btn-xs,
.btn-group-xs > .btn {
padding: 1px 5px; padding: 1px 5px;
font-size: 12px; font-size: 12px;
line-height: 1.5; line-height: 1.5;
@ -3196,24 +3205,6 @@ input[type="button"].btn-block {
.btn-group.open .dropdown-toggle { .btn-group.open .dropdown-toggle {
outline: 0; outline: 0;
} }
.btn-group-xs > .btn {
padding: 1px 5px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
.btn-group-sm > .btn {
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
.btn-group-lg > .btn {
padding: 10px 16px;
font-size: 18px;
line-height: 1.33;
border-radius: 6px;
}
.btn-group > .btn + .dropdown-toggle { .btn-group > .btn + .dropdown-toggle {
padding-right: 8px; padding-right: 8px;
padding-left: 8px; padding-left: 8px;
@ -3865,6 +3856,9 @@ select[multiple].input-group-sm > .input-group-btn > .btn {
width: auto; width: auto;
vertical-align: middle; vertical-align: middle;
} }
.navbar-form .input-group > .form-control {
width: 100%;
}
.navbar-form .control-label { .navbar-form .control-label {
margin-bottom: 0; margin-bottom: 0;
vertical-align: middle; vertical-align: middle;
@ -4416,9 +4410,6 @@ a.list-group-item.active > .badge,
} }
.thumbnail > img, .thumbnail > img,
.thumbnail a > img { .thumbnail a > img {
display: block;
max-width: 100%;
height: auto;
margin-right: auto; margin-right: auto;
margin-left: auto; margin-left: auto;
} }
@ -4771,6 +4762,31 @@ a.list-group-item-danger.active:focus {
.panel-body { .panel-body {
padding: 15px; padding: 15px;
} }
.panel-heading {
padding: 10px 15px;
border-bottom: 1px solid transparent;
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
.panel-heading > .dropdown .dropdown-toggle {
color: inherit;
}
.panel-title {
margin-top: 0;
margin-bottom: 0;
font-size: 16px;
color: inherit;
}
.panel-title > a {
color: inherit;
}
.panel-footer {
padding: 10px 15px;
background-color: #f5f5f5;
border-top: 1px solid #ddd;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
}
.panel > .list-group { .panel > .list-group {
margin-bottom: 0; margin-bottom: 0;
} }
@ -4889,63 +4905,30 @@ a.list-group-item-danger.active:focus {
.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
border-right: 0; border-right: 0;
} }
.panel > .table-bordered > thead > tr:first-child > th,
.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
.panel > .table-bordered > tbody > tr:first-child > th,
.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th,
.panel > .table-bordered > tfoot > tr:first-child > th,
.panel > .table-responsive > .table-bordered > tfoot > tr:first-child > th,
.panel > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > td,
.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
.panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td,
.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
.panel > .table-bordered > tfoot > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th,
.panel > .table-responsive > .table-bordered > tfoot > tr:first-child > td { .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
border-top: 0; .panel > .table-bordered > tbody > tr:first-child > th,
.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
border-bottom: 0;
} }
.panel > .table-bordered > thead > tr:last-child > th,
.panel > .table-responsive > .table-bordered > thead > tr:last-child > th,
.panel > .table-bordered > tbody > tr:last-child > th,
.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
.panel > .table-bordered > tfoot > tr:last-child > th,
.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th,
.panel > .table-bordered > thead > tr:last-child > td,
.panel > .table-responsive > .table-bordered > thead > tr:last-child > td,
.panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > td,
.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
.panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td,
.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td { .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
.panel > .table-bordered > tbody > tr:last-child > th,
.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
.panel > .table-bordered > tfoot > tr:last-child > th,
.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
border-bottom: 0; border-bottom: 0;
} }
.panel > .table-responsive { .panel > .table-responsive {
margin-bottom: 0; margin-bottom: 0;
border: 0; border: 0;
} }
.panel-heading {
padding: 10px 15px;
border-bottom: 1px solid transparent;
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
.panel-heading > .dropdown .dropdown-toggle {
color: inherit;
}
.panel-title {
margin-top: 0;
margin-bottom: 0;
font-size: 16px;
color: inherit;
}
.panel-title > a {
color: inherit;
}
.panel-footer {
padding: 10px 15px;
background-color: #f5f5f5;
border-top: 1px solid #ddd;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
}
.panel-group { .panel-group {
margin-bottom: 20px; margin-bottom: 20px;
} }
@ -5446,9 +5429,6 @@ button.close {
} }
.carousel-inner > .item > img, .carousel-inner > .item > img,
.carousel-inner > .item > a > img { .carousel-inner > .item > a > img {
display: block;
max-width: 100%;
height: auto;
line-height: 1; line-height: 1;
} }
.carousel-inner > .active, .carousel-inner > .active,

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -572,6 +572,37 @@
<p class="help-block">Point at which the navbar begins collapsing.</p> <p class="help-block">Point at which the navbar begins collapsing.</p>
</div> </div>
</div> </div>
<h2 id="container-sizes">Container sizes</h2>
<p>Define the maximum width of <code>.container</code> for different screen sizes.</p>
<div class="row">
<div class="bs-customizer-input">
<label for="input-@container-tablet">@container-tablet</label>
<input id="input-@container-tablet" type="text" value="((720px + @grid-gutter-width))" data-var="@container-tablet" class="form-control"/>
</div>
<div class="bs-customizer-input">
<label for="input-@container-sm">@container-sm</label>
<input id="input-@container-sm" type="text" value="@container-tablet" data-var="@container-sm" class="form-control"/>
<p class="help-block">For <code>@screen-sm-min</code> and up.</p>
</div>
<div class="bs-customizer-input">
<label for="input-@container-desktop">@container-desktop</label>
<input id="input-@container-desktop" type="text" value="((940px + @grid-gutter-width))" data-var="@container-desktop" class="form-control"/>
</div>
<div class="bs-customizer-input">
<label for="input-@container-md">@container-md</label>
<input id="input-@container-md" type="text" value="@container-desktop" data-var="@container-md" class="form-control"/>
<p class="help-block">For <code>@screen-md-min</code> and up.</p>
</div>
<div class="bs-customizer-input">
<label for="input-@container-large-desktop">@container-large-desktop</label>
<input id="input-@container-large-desktop" type="text" value="((1140px + @grid-gutter-width))" data-var="@container-large-desktop" class="form-control"/>
</div>
<div class="bs-customizer-input">
<label for="input-@container-lg">@container-lg</label>
<input id="input-@container-lg" type="text" value="@container-large-desktop" data-var="@container-lg" class="form-control"/>
<p class="help-block">For <code>@screen-lg-min</code> and up.</p>
</div>
</div>
<h2 id="navbar">Navbar</h2> <h2 id="navbar">Navbar</h2>
<p></p> <p></p>
<div class="row"> <div class="row">
@ -1631,6 +1662,11 @@
<input id="input-@blockquote-small-color" type="text" value="@gray-light" data-var="@blockquote-small-color" class="form-control"/> <input id="input-@blockquote-small-color" type="text" value="@gray-light" data-var="@blockquote-small-color" class="form-control"/>
<p class="help-block">Blockquote small color</p> <p class="help-block">Blockquote small color</p>
</div> </div>
<div class="bs-customizer-input">
<label for="input-@blockquote-font-size">@blockquote-font-size</label>
<input id="input-@blockquote-font-size" type="text" value="(@font-size-base * 1.25)" data-var="@blockquote-font-size" class="form-control"/>
<p class="help-block">Blockquote font size</p>
</div>
<div class="bs-customizer-input"> <div class="bs-customizer-input">
<label for="input-@blockquote-border-color">@blockquote-border-color</label> <label for="input-@blockquote-border-color">@blockquote-border-color</label>
<input id="input-@blockquote-border-color" type="text" value="@gray-lighter" data-var="@blockquote-border-color" class="form-control"/> <input id="input-@blockquote-border-color" type="text" value="@gray-lighter" data-var="@blockquote-border-color" class="form-control"/>
@ -1656,35 +1692,4 @@
<p class="help-block">Horizontal offset for forms and lists.</p> <p class="help-block">Horizontal offset for forms and lists.</p>
</div> </div>
</div> </div>
<h2 id="container-sizes">Container sizes</h2>
<p>Define the maximum width of <code>.container</code> for different screen sizes.</p>
<div class="row">
<div class="bs-customizer-input">
<label for="input-@container-tablet">@container-tablet</label>
<input id="input-@container-tablet" type="text" value="((720px + @grid-gutter-width))" data-var="@container-tablet" class="form-control"/>
</div>
<div class="bs-customizer-input">
<label for="input-@container-sm">@container-sm</label>
<input id="input-@container-sm" type="text" value="@container-tablet" data-var="@container-sm" class="form-control"/>
<p class="help-block">For <code>@screen-sm-min</code> and up.</p>
</div>
<div class="bs-customizer-input">
<label for="input-@container-desktop">@container-desktop</label>
<input id="input-@container-desktop" type="text" value="((940px + @grid-gutter-width))" data-var="@container-desktop" class="form-control"/>
</div>
<div class="bs-customizer-input">
<label for="input-@container-md">@container-md</label>
<input id="input-@container-md" type="text" value="@container-desktop" data-var="@container-md" class="form-control"/>
<p class="help-block">For <code>@screen-md-min</code> and up.</p>
</div>
<div class="bs-customizer-input">
<label for="input-@container-large-desktop">@container-large-desktop</label>
<input id="input-@container-large-desktop" type="text" value="((1140px + @grid-gutter-width))" data-var="@container-large-desktop" class="form-control"/>
</div>
<div class="bs-customizer-input">
<label for="input-@container-lg">@container-lg</label>
<input id="input-@container-lg" type="text" value="@container-large-desktop" data-var="@container-lg" class="form-control"/>
<p class="help-block">For <code>@screen-lg-min</code> and up.</p>
</div>
</div>
<!-- NOTE: DO NOT EDIT THE PRECEDING SECTION DIRECTLY! It is autogenerated via the `build-customizer-html` Grunt task using the customizer-variables.jade template.--> <!-- NOTE: DO NOT EDIT THE PRECEDING SECTION DIRECTLY! It is autogenerated via the `build-customizer-html` Grunt task using the customizer-variables.jade template.-->

View File

@ -102,6 +102,7 @@
<a href="#progress">Progress bars</a> <a href="#progress">Progress bars</a>
<ul class="nav"> <ul class="nav">
<li><a href="#progress-basic">Basic example</a></li> <li><a href="#progress-basic">Basic example</a></li>
<li><a href="#progress-label">With label</a></li>
<li><a href="#progress-alternatives">Contextual alternatives</a></li> <li><a href="#progress-alternatives">Contextual alternatives</a></li>
<li><a href="#progress-striped">Striped</a></li> <li><a href="#progress-striped">Striped</a></li>
<li><a href="#progress-animated">Animated</a></li> <li><a href="#progress-animated">Animated</a></li>

View File

@ -14,6 +14,7 @@
<li><a href="#dropdowns">Dropdowns</a></li> <li><a href="#dropdowns">Dropdowns</a></li>
<li><a href="#media-queries-breakpoints">Media queries breakpoints</a></li> <li><a href="#media-queries-breakpoints">Media queries breakpoints</a></li>
<li><a href="#grid-system">Grid system</a></li> <li><a href="#grid-system">Grid system</a></li>
<li><a href="#container-sizes">Container sizes</a></li>
<li><a href="#navbar">Navbar</a></li> <li><a href="#navbar">Navbar</a></li>
<li><a href="#navs">Navs</a></li> <li><a href="#navs">Navs</a></li>
<li><a href="#tabs">Tabs</a></li> <li><a href="#tabs">Tabs</a></li>
@ -39,7 +40,6 @@
<li><a href="#code">Code</a></li> <li><a href="#code">Code</a></li>
<li><a href="#type">Type</a></li> <li><a href="#type">Type</a></li>
<li><a href="#miscellaneous">Miscellaneous</a></li> <li><a href="#miscellaneous">Miscellaneous</a></li>
<li><a href="#container-sizes">Container sizes</a></li>
</ul> </ul>
</li> </li>
<li><a href="#download">Download</a></li> <li><a href="#download">Download</a></li>

View File

@ -1,4 +1,4 @@
<header class="navbar navbar-static-top bs-docs-nav" role="banner" id="top"> <header class="navbar navbar-static-top bs-docs-nav" id="top" role="banner">
<div class="container"> <div class="container">
<div class="navbar-header"> <div class="navbar-header">
<button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse"> <button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">

File diff suppressed because one or more lines are too long

View File

@ -13,7 +13,7 @@ window.onload = function () { // wait for load in a dumb way because B-0
' * Bootstrap v3.1.0 (http://getbootstrap.com)\n' + ' * Bootstrap v3.1.0 (http://getbootstrap.com)\n' +
' * Copyright 2011-2014 Twitter, Inc.\n' + ' * Copyright 2011-2014 Twitter, Inc.\n' +
' * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n' + ' * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n' +
' */\n\n'; ' */\n\n'
function showError(msg, err) { function showError(msg, err) {
$('<div id="bsCustomizerAlert" class="bs-customizer-alert">\ $('<div id="bsCustomizerAlert" class="bs-customizer-alert">\
@ -40,9 +40,9 @@ window.onload = function () { // wait for load in a dumb way because B-0
} }
function getQueryParam(key) { function getQueryParam(key) {
key = key.replace(/[*+?^$.\[\]{}()|\\\/]/g, '\\$&'); // escape RegEx meta chars key = key.replace(/[*+?^$.\[\]{}()|\\\/]/g, '\\$&') // escape RegEx meta chars
var match = location.search.match(new RegExp('[?&]' + key + '=([^&]+)(&|$)')); var match = location.search.match(new RegExp('[?&]' + key + '=([^&]+)(&|$)'))
return match && decodeURIComponent(match[1].replace(/\+/g, ' ')); return match && decodeURIComponent(match[1].replace(/\+/g, ' '))
} }
function createGist(configJson) { function createGist(configJson) {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,35 +1,43 @@
/*! /*!
Holder - 2.2 - client side image placeholders Holder - 2.3.1 - client side image placeholders
(c) 2012-2013 Ivan Malopinsky / http://imsky.co (c) 2012-2014 Ivan Malopinsky / http://imsky.co
Provided under the MIT License. Provided under the MIT License.
Commercial use requires attribution. Commercial use requires attribution.
*/ */
var Holder = Holder || {}; var Holder = Holder || {};
(function (app, win) { (function (app, win) {
var system_config = {
var preempted = false, use_svg: false,
fallback = false, use_canvas: false,
use_fallback: false
};
var instance_config = {};
var preempted = false;
canvas = document.createElement('canvas'); canvas = document.createElement('canvas');
var dpr = 1, bsr = 1; var dpr = 1, bsr = 1;
var resizable_images = []; var resizable_images = [];
if (!canvas.getContext) { if (!canvas.getContext) {
fallback = true; system_config.use_fallback = true;
} else { } else {
if (canvas.toDataURL("image/png") if (canvas.toDataURL("image/png")
.indexOf("data:image/png") < 0) { .indexOf("data:image/png") < 0) {
//Android doesn't support data URI //Android doesn't support data URI
fallback = true; system_config.use_fallback = true;
} else { } else {
var ctx = canvas.getContext("2d"); var ctx = canvas.getContext("2d");
} }
} }
if(!fallback){ if(!!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect){
system_config.use_svg = true;
system_config.use_canvas = false;
}
if(!system_config.use_fallback){
dpr = window.devicePixelRatio || 1, dpr = window.devicePixelRatio || 1,
bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1; bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;
} }
@ -129,46 +137,6 @@ app.flags = {
} }
} }
//getElementsByClassName polyfill
document.getElementsByClassName||(document.getElementsByClassName=function(e){var t=document,n,r,i,s=[];if(t.querySelectorAll)return t.querySelectorAll("."+e);if(t.evaluate){r=".//*[contains(concat(' ', @class, ' '), ' "+e+" ')]",n=t.evaluate(r,t,null,0,null);while(i=n.iterateNext())s.push(i)}else{n=t.getElementsByTagName("*"),r=new RegExp("(^|\\s)"+e+"(\\s|$)");for(i=0;i<n.length;i++)r.test(n[i].className)&&s.push(n[i])}return s})
//getComputedStyle polyfill
window.getComputedStyle||(window.getComputedStyle=function(e){return this.el=e,this.getPropertyValue=function(t){var n=/(\-([a-z]){1})/g;return t=="float"&&(t="styleFloat"),n.test(t)&&(t=t.replace(n,function(){return arguments[2].toUpperCase()})),e.currentStyle[t]?e.currentStyle[t]:null},this})
//http://javascript.nwbox.com/ContentLoaded by Diego Perini with modifications
function contentLoaded(n,t){var l="complete",s="readystatechange",u=!1,h=u,c=!0,i=n.document,a=i.documentElement,e=i.addEventListener?"addEventListener":"attachEvent",v=i.addEventListener?"removeEventListener":"detachEvent",f=i.addEventListener?"":"on",r=function(e){(e.type!=s||i.readyState==l)&&((e.type=="load"?n:i)[v](f+e.type,r,u),!h&&(h=!0)&&t.call(n,null))},o=function(){try{a.doScroll("left")}catch(n){setTimeout(o,50);return}r("poll")};if(i.readyState==l)t.call(n,"lazy");else{if(i.createEventObject&&a.doScroll){try{c=!n.frameElement}catch(y){}c&&o()}i[e](f+"DOMContentLoaded",r,u),i[e](f+s,r,u),n[e](f+"load",r,u)}}
//https://gist.github.com/991057 by Jed Schmidt with modifications
function selector(a){
a=a.match(/^(\W)?(.*)/);var b=document["getElement"+(a[1]?a[1]=="#"?"ById":"sByClassName":"sByTagName")](a[2]);
var ret=[]; b!==null&&(b.length?ret=b:b.length===0?ret=b:ret=[b]); return ret;
}
//shallow object property extend
function extend(a,b){
var c={};
for(var i in a){
if(a.hasOwnProperty(i)){
c[i]=a[i];
}
}
for(var i in b){
if(b.hasOwnProperty(i)){
c[i]=b[i];
}
}
return c
}
//hasOwnProperty polyfill
if (!Object.prototype.hasOwnProperty)
/*jshint -W001, -W103 */
Object.prototype.hasOwnProperty = function(prop) {
var proto = this.__proto__ || this.constructor.prototype;
return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
}
/*jshint +W001, +W103 */
function text_size(width, height, template) { function text_size(width, height, template) {
height = parseInt(height, 10); height = parseInt(height, 10);
width = parseInt(width, 10); width = parseInt(width, 10);
@ -181,20 +149,68 @@ function text_size(width, height, template) {
} }
} }
function draw(args) { var svg_el = (function(){
var ctx = args.ctx; //Prevent IE <9 from initializing SVG renderer
var dimensions = args.dimensions; if(!window.XMLSerializer) return;
var template = args.template; var serializer = new XMLSerializer();
var ratio = args.ratio; var svg_ns = "http://www.w3.org/2000/svg"
var holder = args.holder; var svg = document.createElementNS(svg_ns, "svg");
var literal = holder.textmode == "literal"; //IE throws an exception if this is set and Chrome requires it to be set
var exact = holder.textmode == "exact"; if(svg.webkitMatchesSelector){
svg.setAttribute("xmlns", "http://www.w3.org/2000/svg")
}
var bg_el = document.createElementNS(svg_ns, "rect")
var text_el = document.createElementNS(svg_ns, "text")
var textnode_el = document.createTextNode(null)
text_el.setAttribute("text-anchor", "middle")
text_el.appendChild(textnode_el)
svg.appendChild(bg_el)
svg.appendChild(text_el)
return function(props){
svg.setAttribute("width",props.width);
svg.setAttribute("height", props.height);
bg_el.setAttribute("width", props.width);
bg_el.setAttribute("height", props.height);
bg_el.setAttribute("fill", props.template.background);
text_el.setAttribute("x", props.width/2)
text_el.setAttribute("y", props.height/2)
textnode_el.nodeValue=props.text
text_el.setAttribute("style", css_properties({
"fill": props.template.foreground,
"font-weight": "bold",
"font-size": props.text_height+"px",
"font-family":props.font,
"dominant-baseline":"central"
}))
return serializer.serializeToString(svg)
}
})()
function css_properties(props){
var ret = [];
for(p in props){
if(props.hasOwnProperty(p)){
ret.push(p+":"+props[p])
}
}
return ret.join(";")
}
function draw_canvas(args) {
var ctx = args.ctx,
dimensions = args.dimensions,
template = args.template,
ratio = args.ratio,
holder = args.holder,
literal = holder.textmode == "literal",
exact = holder.textmode == "exact";
var ts = text_size(dimensions.width, dimensions.height, template); var ts = text_size(dimensions.width, dimensions.height, template);
var text_height = ts.height; var text_height = ts.height;
var width = dimensions.width * ratio, var width = dimensions.width * ratio,
height = dimensions.height * ratio; height = dimensions.height * ratio;
var font = template.font ? template.font : "sans-serif"; var font = template.font ? template.font : "Arial,Helvetica,sans-serif";
canvas.width = width; canvas.width = width;
canvas.height = height; canvas.height = height;
ctx.textAlign = "center"; ctx.textAlign = "center";
@ -222,8 +238,50 @@ function draw(args) {
return canvas.toDataURL("image/png"); return canvas.toDataURL("image/png");
} }
function render(mode, el, holder, src) { function draw_svg(args){
var dimensions = args.dimensions,
template = args.template,
holder = args.holder,
literal = holder.textmode == "literal",
exact = holder.textmode == "exact";
var ts = text_size(dimensions.width, dimensions.height, template);
var text_height = ts.height;
var width = dimensions.width,
height = dimensions.height;
var font = template.font ? template.font : "Arial,Helvetica,sans-serif";
var text = template.text ? template.text : (Math.floor(dimensions.width) + "x" + Math.floor(dimensions.height));
if (literal) {
var dimensions = holder.dimensions;
text = dimensions.width + "x" + dimensions.height;
}
else if(exact && holder.exact_dimensions){
var dimensions = holder.exact_dimensions;
text = (Math.floor(dimensions.width) + "x" + Math.floor(dimensions.height));
}
var string = svg_el({
text: text,
width:width,
height:height,
text_height:text_height,
font:font,
template:template
})
return "data:image/svg+xml;base64,"+btoa(string);
}
function draw(args) {
if(instance_config.use_canvas && !instance_config.use_svg){
return draw_canvas(args);
}
else{
return draw_svg(args);
}
}
function render(mode, el, holder, src) {
var dimensions = holder.dimensions, var dimensions = holder.dimensions,
theme = holder.theme, theme = holder.theme,
text = holder.text ? decodeURIComponent(holder.text) : holder.text; text = holder.text ? decodeURIComponent(holder.text) : holder.text;
@ -240,11 +298,11 @@ function render(mode, el, holder, src) {
if (mode == "image") { if (mode == "image") {
el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption); el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption);
if (fallback || !holder.auto) { if (instance_config.use_fallback || !holder.auto) {
el.style.width = dimensions.width + "px"; el.style.width = dimensions.width + "px";
el.style.height = dimensions.height + "px"; el.style.height = dimensions.height + "px";
} }
if (fallback) { if (instance_config.use_fallback) {
el.style.backgroundColor = theme.background; el.style.backgroundColor = theme.background;
} else { } else {
el.setAttribute("src", draw({ctx: ctx, dimensions: dimensions, template: theme, ratio:ratio, holder: holder})); el.setAttribute("src", draw({ctx: ctx, dimensions: dimensions, template: theme, ratio:ratio, holder: holder}));
@ -256,7 +314,7 @@ function render(mode, el, holder, src) {
} }
} else if (mode == "background") { } else if (mode == "background") {
if (!fallback) { if (!instance_config.use_fallback) {
el.style.backgroundImage = "url(" + draw({ctx:ctx, dimensions: dimensions, template: theme, ratio: ratio, holder: holder}) + ")"; el.style.backgroundImage = "url(" + draw({ctx:ctx, dimensions: dimensions, template: theme, ratio: ratio, holder: holder}) + ")";
el.style.backgroundSize = dimensions.width + "px " + dimensions.height + "px"; el.style.backgroundSize = dimensions.width + "px " + dimensions.height + "px";
} }
@ -264,18 +322,21 @@ function render(mode, el, holder, src) {
el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption); el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption);
if (dimensions.height.slice(-1) == "%") { if (dimensions.height.slice(-1) == "%") {
el.style.height = dimensions.height el.style.height = dimensions.height
} else { } else if(holder.auto == null || !holder.auto){
el.style.height = dimensions.height + "px" el.style.height = dimensions.height + "px"
} }
if (dimensions.width.slice(-1) == "%") { if (dimensions.width.slice(-1) == "%") {
el.style.width = dimensions.width el.style.width = dimensions.width
} else { } else if(holder.auto == null || !holder.auto){
el.style.width = dimensions.width + "px" el.style.width = dimensions.width + "px"
} }
if (el.style.display == "inline" || el.style.display === "" || el.style.display == "none") { if (el.style.display == "inline" || el.style.display === "" || el.style.display == "none") {
el.style.display = "block"; el.style.display = "block";
} }
if (fallback) {
set_initial_dimensions(el)
if (instance_config.use_fallback) {
el.style.backgroundColor = theme.background; el.style.backgroundColor = theme.background;
} else { } else {
resizable_images.push(el); resizable_images.push(el);
@ -290,20 +351,37 @@ function dimension_check(el, callback) {
width: el.clientWidth width: el.clientWidth
}; };
if (!dimensions.height && !dimensions.width) { if (!dimensions.height && !dimensions.width) {
if (el.hasAttribute("data-holder-invisible")) {
throw new Error("Holder: placeholder is not visible");
} else {
el.setAttribute("data-holder-invisible", true) el.setAttribute("data-holder-invisible", true)
setTimeout(function () {
callback.call(this, el) callback.call(this, el)
}, 1)
return null;
} }
} else { else{
el.removeAttribute("data-holder-invisible") el.removeAttribute("data-holder-invisible")
}
return dimensions; return dimensions;
} }
}
function set_initial_dimensions(el){
if(el.holder_data){
var dimensions = dimension_check(el, app.invisible_error_fn( set_initial_dimensions))
if(dimensions){
var holder = el.holder_data;
holder.initial_dimensions = dimensions;
holder.fluid_data = {
fluid_height: holder.dimensions.height.slice(-1) == "%",
fluid_width: holder.dimensions.width.slice(-1) == "%",
mode: null
}
if(holder.fluid_data.fluid_width && !holder.fluid_data.fluid_height){
holder.fluid_data.mode = "width"
holder.fluid_data.ratio = holder.initial_dimensions.width / parseFloat(holder.dimensions.height)
}
else if(!holder.fluid_data.fluid_width && holder.fluid_data.fluid_height){
holder.fluid_data.mode = "height";
holder.fluid_data.ratio = parseFloat(holder.dimensions.width) / holder.initial_dimensions.height
}
}
}
}
function resizable_update(element) { function resizable_update(element) {
var images; var images;
@ -319,9 +397,19 @@ function resizable_update(element) {
var el = images[i] var el = images[i]
if (el.holder_data) { if (el.holder_data) {
var holder = el.holder_data; var holder = el.holder_data;
var dimensions = dimension_check(el, resizable_update) var dimensions = dimension_check(el, app.invisible_error_fn( resizable_update))
if(dimensions){ if(dimensions){
if(holder.fluid){ if(holder.fluid){
if(holder.auto){
switch(holder.fluid_data.mode){
case "width":
dimensions.height = dimensions.width / holder.fluid_data.ratio;
break;
case "height":
dimensions.width = dimensions.height * holder.fluid_data.ratio;
break;
}
}
el.setAttribute("src", draw({ el.setAttribute("src", draw({
ctx: ctx, ctx: ctx,
dimensions: dimensions, dimensions: dimensions,
@ -350,7 +438,7 @@ function parse_flags(flags, options) {
theme: extend(settings.themes.gray, {}) theme: extend(settings.themes.gray, {})
}; };
var render = false; var render = false;
for (sl = flags.length, j = 0; j < sl; j++) { for (var fl = flags.length, j = 0; j < fl; j++) {
var flag = flags[j]; var flag = flags[j];
if (app.flags.dimensions.match(flag)) { if (app.flags.dimensions.match(flag)) {
render = true; render = true;
@ -385,10 +473,20 @@ for (var flag in app.flags) {
return val.match(this.regex) return val.match(this.regex)
} }
} }
app.invisible_error_fn = function(fn){
return function(el){
if(el.hasAttribute("data-holder-invisible")){
throw new Error("Holder: invisible placeholder")
}
}
}
app.add_theme = function (name, theme) { app.add_theme = function (name, theme) {
name != null && theme != null && (settings.themes[name] = theme); name != null && theme != null && (settings.themes[name] = theme);
return app; return app;
}; };
app.add_image = function (src, el) { app.add_image = function (src, el) {
var node = selector(el); var node = selector(el);
if (node.length) { if (node.length) {
@ -400,19 +498,29 @@ app.add_image = function (src, el) {
} }
return app; return app;
}; };
app.run = function (o) { app.run = function (o) {
instance_config = extend({}, system_config)
preempted = true; preempted = true;
var options = extend(settings, o), var options = extend(settings, o),
images = [], images = [],
imageNodes = [], imageNodes = [],
bgnodes = []; bgnodes = [];
if(options.use_canvas != null && options.use_canvas){
instance_config.use_canvas = true;
instance_config.use_svg = false;
}
if (typeof (options.images) == "string") { if (typeof (options.images) == "string") {
imageNodes = selector(options.images); imageNodes = selector(options.images);
} else if (window.NodeList && options.images instanceof window.NodeList) { } else if (window.NodeList && options.images instanceof window.NodeList) {
imageNodes = options.images; imageNodes = options.images;
} else if (window.Node && options.images instanceof window.Node) { } else if (window.Node && options.images instanceof window.Node) {
imageNodes = [options.images]; imageNodes = [options.images];
} else if(window.HTMLCollection && options.images instanceof window.HTMLCollection){
imageNodes = options.images
} }
if (typeof (options.bgnodes) == "string") { if (typeof (options.bgnodes) == "string") {
@ -469,8 +577,7 @@ app.run = function (o) {
src = attr_datasrc; src = attr_datasrc;
} }
if (src) { if (src) {
var holder = parse_flags(src.substr(src.lastIndexOf(options.domain) + options.domain.length + 1) var holder = parse_flags(src.substr(src.lastIndexOf(options.domain) + options.domain.length + 1).split("/"), options);
.split("/"), options);
if (holder) { if (holder) {
if (holder.fluid) { if (holder.fluid) {
render("fluid", images[i], holder, src) render("fluid", images[i], holder, src)
@ -482,6 +589,7 @@ app.run = function (o) {
} }
return app; return app;
}; };
contentLoaded(win, function () { contentLoaded(win, function () {
if (window.addEventListener) { if (window.addEventListener) {
window.addEventListener("resize", resizable_update, false); window.addEventListener("resize", resizable_update, false);
@ -489,7 +597,7 @@ contentLoaded(win, function () {
} else { } else {
window.attachEvent("onresize", resizable_update) window.attachEvent("onresize", resizable_update)
} }
preempted || app.run(); preempted || app.run({});
}); });
if (typeof define === "function" && define.amd) { if (typeof define === "function" && define.amd) {
define([], function () { define([], function () {
@ -497,4 +605,44 @@ if (typeof define === "function" && define.amd) {
}); });
} }
//github.com/davidchambers/Base64.js
(function(){function t(t){this.message=t}var e="undefined"!=typeof exports?exports:this,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";t.prototype=Error(),t.prototype.name="InvalidCharacterError",e.btoa||(e.btoa=function(e){for(var o,n,a=0,i=r,c="";e.charAt(0|a)||(i="=",a%1);c+=i.charAt(63&o>>8-8*(a%1))){if(n=e.charCodeAt(a+=.75),n>255)throw new t("'btoa' failed");o=o<<8|n}return c}),e.atob||(e.atob=function(e){if(e=e.replace(/=+$/,""),1==e.length%4)throw new t("'atob' failed");for(var o,n,a=0,i=0,c="";n=e.charAt(i++);~n&&(o=a%4?64*o+n:n,a++%4)?c+=String.fromCharCode(255&o>>(6&-2*a)):0)n=r.indexOf(n);return c})})();
//getElementsByClassName polyfill
document.getElementsByClassName||(document.getElementsByClassName=function(e){var t=document,n,r,i,s=[];if(t.querySelectorAll)return t.querySelectorAll("."+e);if(t.evaluate){r=".//*[contains(concat(' ', @class, ' '), ' "+e+" ')]",n=t.evaluate(r,t,null,0,null);while(i=n.iterateNext())s.push(i)}else{n=t.getElementsByTagName("*"),r=new RegExp("(^|\\s)"+e+"(\\s|$)");for(i=0;i<n.length;i++)r.test(n[i].className)&&s.push(n[i])}return s})
//getComputedStyle polyfill
window.getComputedStyle||(window.getComputedStyle=function(e){return this.el=e,this.getPropertyValue=function(t){var n=/(\-([a-z]){1})/g;return t=="float"&&(t="styleFloat"),n.test(t)&&(t=t.replace(n,function(){return arguments[2].toUpperCase()})),e.currentStyle[t]?e.currentStyle[t]:null},this})
//http://javascript.nwbox.com/ContentLoaded by Diego Perini with modifications
function contentLoaded(n,t){var l="complete",s="readystatechange",u=!1,h=u,c=!0,i=n.document,a=i.documentElement,e=i.addEventListener?"addEventListener":"attachEvent",v=i.addEventListener?"removeEventListener":"detachEvent",f=i.addEventListener?"":"on",r=function(e){(e.type!=s||i.readyState==l)&&((e.type=="load"?n:i)[v](f+e.type,r,u),!h&&(h=!0)&&t.call(n,null))},o=function(){try{a.doScroll("left")}catch(n){setTimeout(o,50);return}r("poll")};if(i.readyState==l)t.call(n,"lazy");else{if(i.createEventObject&&a.doScroll){try{c=!n.frameElement}catch(y){}c&&o()}i[e](f+"DOMContentLoaded",r,u),i[e](f+s,r,u),n[e](f+"load",r,u)}}
//https://gist.github.com/991057 by Jed Schmidt with modifications
function selector(a,b){var a=a.match(/^(\W)?(.*)/),b=b||document,c=b["getElement"+(a[1]?"#"==a[1]?"ById":"sByClassName":"sByTagName")],d=c.call(b,a[2]),e=[];return null!==d&&(e=d.length||0===d.length?d:[d]),e}
//shallow object property extend
function extend(a,b){
var c={};
for(var i in a){
if(a.hasOwnProperty(i)){
c[i]=a[i];
}
}
for(var i in b){
if(b.hasOwnProperty(i)){
c[i]=b[i];
}
}
return c
}
//hasOwnProperty polyfill
if (!Object.prototype.hasOwnProperty)
/*jshint -W001, -W103 */
Object.prototype.hasOwnProperty = function(prop) {
var proto = this.__proto__ || this.constructor.prototype;
return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
}
/*jshint +W001, +W103 */
})(Holder, window); })(Holder, window);

View File

@ -1,5 +1,15 @@
(function(e){if("function"==typeof bootstrap)bootstrap("jszip",e);else if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else if("undefined"!=typeof ses){if(!ses.ok())return;ses.makeJSZip=e}else"undefined"!=typeof window?window.JSZip=e():global.JSZip=e()})(function(){var define,ses,bootstrap,module,exports; /*!
return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
JSZip - A Javascript class for generating and reading zip files
<http://stuartk.com/jszip>
(c) 2009-2012 Stuart Knightley <stuart [at] stuartk.com>
Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.
JSZip uses the library zlib.js released under the following license :
zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License
*/
!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.JSZip=e():"undefined"!=typeof global?global.JSZip=e():"undefined"!=typeof self&&(self.JSZip=e())}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
'use strict'; 'use strict';
// private property // private property
var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
@ -225,7 +235,7 @@ DataReader.prototype = {
}; };
module.exports = DataReader; module.exports = DataReader;
},{"./utils":15}],5:[function(require,module,exports){ },{"./utils":14}],5:[function(require,module,exports){
'use strict'; 'use strict';
exports.base64 = false; exports.base64 = false;
exports.binary = false; exports.binary = false;
@ -252,16 +262,9 @@ exports.uncompress = function(input) {
return inflate.decompress(); return inflate.decompress();
}; };
},{"zlibjs/bin/rawdeflate.min":20,"zlibjs/bin/rawinflate.min":21}],7:[function(require,module,exports){ },{"zlibjs/bin/rawdeflate.min":19,"zlibjs/bin/rawinflate.min":20}],7:[function(require,module,exports){
'use strict'; 'use strict';
/** /**
JSZip - A Javascript class for generating and reading zip files
<http://stuartk.com/jszip>
(c) 2009-2012 Stuart Knightley <stuart [at] stuartk.com>
Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.
Usage: Usage:
zip = new JSZip(); zip = new JSZip();
zip.file("hello.txt", "Hello, World!").file("tempfile", "nothing"); zip.file("hello.txt", "Hello, World!").file("tempfile", "nothing");
@ -306,12 +309,13 @@ function JSZip(data, options) {
JSZip.prototype = require('./object'); JSZip.prototype = require('./object');
JSZip.prototype.load = require('./load'); JSZip.prototype.load = require('./load');
JSZip.support = require('./support'); JSZip.support = require('./support');
JSZip.defaults = require('./defaults');
JSZip.utils = require('./utils'); JSZip.utils = require('./utils');
JSZip.base64 = require('./base64'); JSZip.base64 = require('./base64');
JSZip.compressions = require('./compressions'); JSZip.compressions = require('./compressions');
module.exports = JSZip; module.exports = JSZip;
},{"./base64":1,"./compressions":3,"./load":8,"./object":10,"./support":13,"./utils":15}],8:[function(require,module,exports){ },{"./base64":1,"./compressions":3,"./defaults":5,"./load":8,"./object":9,"./support":12,"./utils":14}],8:[function(require,module,exports){
'use strict'; 'use strict';
var base64 = require('./base64'); var base64 = require('./base64');
var ZipEntries = require('./zipEntries'); var ZipEntries = require('./zipEntries');
@ -337,29 +341,7 @@ module.exports = function(data, options) {
return this; return this;
}; };
},{"./base64":1,"./zipEntries":16}],9:[function(require,module,exports){ },{"./base64":1,"./zipEntries":15}],9:[function(require,module,exports){
'use strict';
var Uint8ArrayReader = require('./uint8ArrayReader');
function NodeBufferReader(data) {
this.data = data;
this.length = this.data.length;
this.index = 0;
}
NodeBufferReader.prototype = new Uint8ArrayReader();
/**
* @see DataReader.readData
*/
NodeBufferReader.prototype.readData = function(size) {
this.checkOffset(size);
var result = this.data.slice(this.index, this.index + size);
this.index += size;
return result;
};
module.exports = NodeBufferReader;
},{"./uint8ArrayReader":14}],10:[function(require,module,exports){
'use strict'; 'use strict';
var support = require('./support'); var support = require('./support');
var utils = require('./utils'); var utils = require('./utils');
@ -714,7 +696,9 @@ var generateZipParts = function(name, file, compressedObject, offset) {
useUTF8 = utfEncodedFileName !== file.name, useUTF8 = utfEncodedFileName !== file.name,
o = file.options, o = file.options,
dosTime, dosTime,
dosDate; dosDate,
extraFields = "",
unicodePathExtraField = "";
// date // date
// @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html
@ -733,6 +717,32 @@ var generateZipParts = function(name, file, compressedObject, offset) {
dosDate = dosDate << 5; dosDate = dosDate << 5;
dosDate = dosDate | o.date.getDate(); dosDate = dosDate | o.date.getDate();
if (useUTF8) {
// set the unicode path extra field. unzip needs at least one extra
// field to correctly handle unicode path, so using the path is as good
// as any other information. This could improve the situation with
// other archive managers too.
// This field is usually used without the utf8 flag, with a non
// unicode path in the header (winrar, winzip). This helps (a bit)
// with the messy Windows' default compressed folders feature but
// breaks on p7zip which doesn't seek the unicode path extra field.
// So for now, UTF-8 everywhere !
unicodePathExtraField =
// Version
decToHex(1, 1) +
// NameCRC32
decToHex(this.crc32(utfEncodedFileName), 4) +
// UnicodeName
utfEncodedFileName;
extraFields +=
// Info-ZIP Unicode Path Extra Field
"\x75\x70" +
// size
decToHex(unicodePathExtraField.length, 2) +
// content
unicodePathExtraField;
}
var header = ""; var header = "";
@ -756,10 +766,10 @@ var generateZipParts = function(name, file, compressedObject, offset) {
// file name length // file name length
header += decToHex(utfEncodedFileName.length, 2); header += decToHex(utfEncodedFileName.length, 2);
// extra field length // extra field length
header += "\x00\x00"; header += decToHex(extraFields.length, 2);
var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName; var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields;
var dirRecord = signature.CENTRAL_FILE_HEADER + var dirRecord = signature.CENTRAL_FILE_HEADER +
// version made by (00: DOS) // version made by (00: DOS)
@ -777,7 +787,9 @@ var generateZipParts = function(name, file, compressedObject, offset) {
// relative offset of local header // relative offset of local header
decToHex(offset, 4) + decToHex(offset, 4) +
// file name // file name
utfEncodedFileName; utfEncodedFileName +
// extra field
extraFields;
return { return {
@ -1270,7 +1282,7 @@ var out = {
}; };
module.exports = out; module.exports = out;
},{"./base64":1,"./compressedObject":2,"./compressions":3,"./defaults":5,"./nodeBuffer":18,"./signature":11,"./support":13,"./utils":15}],11:[function(require,module,exports){ },{"./base64":1,"./compressedObject":2,"./compressions":3,"./defaults":5,"./nodeBuffer":17,"./signature":10,"./support":12,"./utils":14}],10:[function(require,module,exports){
'use strict'; 'use strict';
exports.LOCAL_FILE_HEADER = "PK\x03\x04"; exports.LOCAL_FILE_HEADER = "PK\x03\x04";
exports.CENTRAL_FILE_HEADER = "PK\x01\x02"; exports.CENTRAL_FILE_HEADER = "PK\x01\x02";
@ -1279,7 +1291,7 @@ exports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x06\x07";
exports.ZIP64_CENTRAL_DIRECTORY_END = "PK\x06\x06"; exports.ZIP64_CENTRAL_DIRECTORY_END = "PK\x06\x06";
exports.DATA_DESCRIPTOR = "PK\x07\x08"; exports.DATA_DESCRIPTOR = "PK\x07\x08";
},{}],12:[function(require,module,exports){ },{}],11:[function(require,module,exports){
'use strict'; 'use strict';
var DataReader = require('./dataReader'); var DataReader = require('./dataReader');
var utils = require('./utils'); var utils = require('./utils');
@ -1317,7 +1329,7 @@ StringReader.prototype.readData = function(size) {
}; };
module.exports = StringReader; module.exports = StringReader;
},{"./dataReader":4,"./utils":15}],13:[function(require,module,exports){ },{"./dataReader":4,"./utils":14}],12:[function(require,module,exports){
var process=require("__browserify_process");'use strict'; var process=require("__browserify_process");'use strict';
exports.base64 = true; exports.base64 = true;
exports.array = true; exports.array = true;
@ -1351,7 +1363,7 @@ else {
} }
} }
},{"__browserify_process":19}],14:[function(require,module,exports){ },{"__browserify_process":18}],13:[function(require,module,exports){
'use strict'; 'use strict';
var DataReader = require('./dataReader'); var DataReader = require('./dataReader');
@ -1396,7 +1408,7 @@ Uint8ArrayReader.prototype.readData = function(size) {
}; };
module.exports = Uint8ArrayReader; module.exports = Uint8ArrayReader;
},{"./dataReader":4}],15:[function(require,module,exports){ },{"./dataReader":4}],14:[function(require,module,exports){
'use strict'; 'use strict';
var support = require('./support'); var support = require('./support');
var compressions = require('./compressions'); var compressions = require('./compressions');
@ -1749,7 +1761,7 @@ exports.isRegExp = function (object) {
}; };
},{"./compressions":3,"./nodeBuffer":18,"./support":13}],16:[function(require,module,exports){ },{"./compressions":3,"./nodeBuffer":17,"./support":12}],15:[function(require,module,exports){
'use strict'; 'use strict';
var StringReader = require('./stringReader'); var StringReader = require('./stringReader');
var NodeBufferReader = require('./nodeBufferReader'); var NodeBufferReader = require('./nodeBufferReader');
@ -1947,7 +1959,7 @@ ZipEntries.prototype = {
// }}} end of ZipEntries // }}} end of ZipEntries
module.exports = ZipEntries; module.exports = ZipEntries;
},{"./nodeBufferReader":9,"./signature":11,"./stringReader":12,"./support":13,"./uint8ArrayReader":14,"./utils":15,"./zipEntry":17}],17:[function(require,module,exports){ },{"./nodeBufferReader":17,"./signature":10,"./stringReader":11,"./support":12,"./uint8ArrayReader":13,"./utils":14,"./zipEntry":16}],16:[function(require,module,exports){
'use strict'; 'use strict';
var StringReader = require('./stringReader'); var StringReader = require('./stringReader');
var utils = require('./utils'); var utils = require('./utils');
@ -2166,14 +2178,43 @@ ZipEntry.prototype = {
if (this.useUTF8()) { if (this.useUTF8()) {
this.fileName = jszipProto.utf8decode(this.fileName); this.fileName = jszipProto.utf8decode(this.fileName);
this.fileComment = jszipProto.utf8decode(this.fileComment); this.fileComment = jszipProto.utf8decode(this.fileComment);
} else {
var upath = this.findExtraFieldUnicodePath();
if (upath !== null) {
this.fileName = upath;
} }
} }
},
/**
* Find the unicode path declared in the extra field, if any.
* @return {String} the unicode path, null otherwise.
*/
findExtraFieldUnicodePath: function() {
var upathField = this.extraFields[0x7075];
if (upathField) {
var extraReader = new StringReader(upathField.value);
// wrong version
if (extraReader.readInt(1) !== 1) {
return null;
}
// the crc of the filename changed, this field is out of date.
if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) {
return null;
}
return jszipProto.utf8decode(extraReader.readString(upathField.length - 5));
}
return null;
}
}; };
module.exports = ZipEntry; module.exports = ZipEntry;
},{"./compressedObject":2,"./object":10,"./stringReader":12,"./utils":15}],18:[function(require,module,exports){ },{"./compressedObject":2,"./object":9,"./stringReader":11,"./utils":14}],17:[function(require,module,exports){
},{}],19:[function(require,module,exports){ },{}],18:[function(require,module,exports){
// shim for using process in browser // shim for using process in browser
var process = module.exports = {}; var process = module.exports = {};
@ -2192,7 +2233,8 @@ process.nextTick = (function () {
if (canPost) { if (canPost) {
var queue = []; var queue = [];
window.addEventListener('message', function (ev) { window.addEventListener('message', function (ev) {
if (ev.source === window && ev.data === 'process-tick') { var source = ev.source;
if ((source === window || source === null) && ev.data === 'process-tick') {
ev.stopPropagation(); ev.stopPropagation();
if (queue.length > 0) { if (queue.length > 0) {
var fn = queue.shift(); var fn = queue.shift();
@ -2227,7 +2269,7 @@ process.chdir = function (dir) {
throw new Error('process.chdir is not supported'); throw new Error('process.chdir is not supported');
}; };
},{}],20:[function(require,module,exports){ },{}],19:[function(require,module,exports){
/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';var n=void 0,u=!0,aa=this;function ba(e,d){var c=e.split("."),f=aa;!(c[0]in f)&&f.execScript&&f.execScript("var "+c[0]);for(var a;c.length&&(a=c.shift());)!c.length&&d!==n?f[a]=d:f=f[a]?f[a]:f[a]={}};var C="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array;function K(e,d){this.index="number"===typeof d?d:0;this.d=0;this.buffer=e instanceof(C?Uint8Array:Array)?e:new (C?Uint8Array:Array)(32768);if(2*this.buffer.length<=this.index)throw Error("invalid index");this.buffer.length<=this.index&&ca(this)}function ca(e){var d=e.buffer,c,f=d.length,a=new (C?Uint8Array:Array)(f<<1);if(C)a.set(d);else for(c=0;c<f;++c)a[c]=d[c];return e.buffer=a} /** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';var n=void 0,u=!0,aa=this;function ba(e,d){var c=e.split("."),f=aa;!(c[0]in f)&&f.execScript&&f.execScript("var "+c[0]);for(var a;c.length&&(a=c.shift());)!c.length&&d!==n?f[a]=d:f=f[a]?f[a]:f[a]={}};var C="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array;function K(e,d){this.index="number"===typeof d?d:0;this.d=0;this.buffer=e instanceof(C?Uint8Array:Array)?e:new (C?Uint8Array:Array)(32768);if(2*this.buffer.length<=this.index)throw Error("invalid index");this.buffer.length<=this.index&&ca(this)}function ca(e){var d=e.buffer,c,f=d.length,a=new (C?Uint8Array:Array)(f<<1);if(C)a.set(d);else for(c=0;c<f;++c)a[c]=d[c];return e.buffer=a}
K.prototype.a=function(e,d,c){var f=this.buffer,a=this.index,b=this.d,k=f[a],m;c&&1<d&&(e=8<d?(L[e&255]<<24|L[e>>>8&255]<<16|L[e>>>16&255]<<8|L[e>>>24&255])>>32-d:L[e]>>8-d);if(8>d+b)k=k<<d|e,b+=d;else for(m=0;m<d;++m)k=k<<1|e>>d-m-1&1,8===++b&&(b=0,f[a++]=L[k],k=0,a===f.length&&(f=ca(this)));f[a]=k;this.buffer=f;this.d=b;this.index=a};K.prototype.finish=function(){var e=this.buffer,d=this.index,c;0<this.d&&(e[d]<<=8-this.d,e[d]=L[e[d]],d++);C?c=e.subarray(0,d):(e.length=d,c=e);return c}; K.prototype.a=function(e,d,c){var f=this.buffer,a=this.index,b=this.d,k=f[a],m;c&&1<d&&(e=8<d?(L[e&255]<<24|L[e>>>8&255]<<16|L[e>>>16&255]<<8|L[e>>>24&255])>>32-d:L[e]>>8-d);if(8>d+b)k=k<<d|e,b+=d;else for(m=0;m<d;++m)k=k<<1|e>>d-m-1&1,8===++b&&(b=0,f[a++]=L[k],k=0,a===f.length&&(f=ca(this)));f[a]=k;this.buffer=f;this.d=b;this.index=a};K.prototype.finish=function(){var e=this.buffer,d=this.index,c;0<this.d&&(e[d]<<=8-this.d,e[d]=L[e[d]],d++);C?c=e.subarray(0,d):(e.length=d,c=e);return c};
var ga=new (C?Uint8Array:Array)(256),M;for(M=0;256>M;++M){for(var R=M,S=R,ha=7,R=R>>>1;R;R>>>=1)S<<=1,S|=R&1,--ha;ga[M]=(S<<ha&255)>>>0}var L=ga;function ja(e){this.buffer=new (C?Uint16Array:Array)(2*e);this.length=0}ja.prototype.getParent=function(e){return 2*((e-2)/4|0)};ja.prototype.push=function(e,d){var c,f,a=this.buffer,b;c=this.length;a[this.length++]=d;for(a[this.length++]=e;0<c;)if(f=this.getParent(c),a[c]>a[f])b=a[c],a[c]=a[f],a[f]=b,b=a[c+1],a[c+1]=a[f+1],a[f+1]=b,c=f;else break;return this.length}; var ga=new (C?Uint8Array:Array)(256),M;for(M=0;256>M;++M){for(var R=M,S=R,ha=7,R=R>>>1;R;R>>>=1)S<<=1,S|=R&1,--ha;ga[M]=(S<<ha&255)>>>0}var L=ga;function ja(e){this.buffer=new (C?Uint16Array:Array)(2*e);this.length=0}ja.prototype.getParent=function(e){return 2*((e-2)/4|0)};ja.prototype.push=function(e,d){var c,f,a=this.buffer,b;c=this.length;a[this.length++]=d;for(a[this.length++]=e;0<c;)if(f=this.getParent(c),a[c]>a[f])b=a[c],a[c]=a[f],a[f]=b,b=a[c+1],a[c+1]=a[f+1],a[f+1]=b,c=f;else break;return this.length};
@ -2250,9 +2292,9 @@ function Ha(e,d,c){var f,a,b=0,k,m,g,p,v=e.length;m=0;p=c.length;a:for(;m<p;m++)
function oa(e,d){var c=e.length,f=new ja(572),a=new (C?Uint8Array:Array)(c),b,k,m,g,p;if(!C)for(g=0;g<c;g++)a[g]=0;for(g=0;g<c;++g)0<e[g]&&f.push(g,e[g]);b=Array(f.length/2);k=new (C?Uint32Array:Array)(f.length/2);if(1===b.length)return a[f.pop().index]=1,a;g=0;for(p=f.length/2;g<p;++g)b[g]=f.pop(),k[g]=b[g].value;m=Ja(k,k.length,d);g=0;for(p=b.length;g<p;++g)a[b[g].index]=m[g];return a} function oa(e,d){var c=e.length,f=new ja(572),a=new (C?Uint8Array:Array)(c),b,k,m,g,p;if(!C)for(g=0;g<c;g++)a[g]=0;for(g=0;g<c;++g)0<e[g]&&f.push(g,e[g]);b=Array(f.length/2);k=new (C?Uint32Array:Array)(f.length/2);if(1===b.length)return a[f.pop().index]=1,a;g=0;for(p=f.length/2;g<p;++g)b[g]=f.pop(),k[g]=b[g].value;m=Ja(k,k.length,d);g=0;for(p=b.length;g<p;++g)a[b[g].index]=m[g];return a}
function Ja(e,d,c){function f(a){var b=g[a][p[a]];b===d?(f(a+1),f(a+1)):--k[b];++p[a]}var a=new (C?Uint16Array:Array)(c),b=new (C?Uint8Array:Array)(c),k=new (C?Uint8Array:Array)(d),m=Array(c),g=Array(c),p=Array(c),v=(1<<c)-d,x=1<<c-1,l,h,q,t,w;a[c-1]=d;for(h=0;h<c;++h)v<x?b[h]=0:(b[h]=1,v-=x),v<<=1,a[c-2-h]=(a[c-1-h]/2|0)+d;a[0]=b[0];m[0]=Array(a[0]);g[0]=Array(a[0]);for(h=1;h<c;++h)a[h]>2*a[h-1]+b[h]&&(a[h]=2*a[h-1]+b[h]),m[h]=Array(a[h]),g[h]=Array(a[h]);for(l=0;l<d;++l)k[l]=c;for(q=0;q<a[c-1];++q)m[c- function Ja(e,d,c){function f(a){var b=g[a][p[a]];b===d?(f(a+1),f(a+1)):--k[b];++p[a]}var a=new (C?Uint16Array:Array)(c),b=new (C?Uint8Array:Array)(c),k=new (C?Uint8Array:Array)(d),m=Array(c),g=Array(c),p=Array(c),v=(1<<c)-d,x=1<<c-1,l,h,q,t,w;a[c-1]=d;for(h=0;h<c;++h)v<x?b[h]=0:(b[h]=1,v-=x),v<<=1,a[c-2-h]=(a[c-1-h]/2|0)+d;a[0]=b[0];m[0]=Array(a[0]);g[0]=Array(a[0]);for(h=1;h<c;++h)a[h]>2*a[h-1]+b[h]&&(a[h]=2*a[h-1]+b[h]),m[h]=Array(a[h]),g[h]=Array(a[h]);for(l=0;l<d;++l)k[l]=c;for(q=0;q<a[c-1];++q)m[c-
1][q]=e[q],g[c-1][q]=q;for(l=0;l<c;++l)p[l]=0;1===b[c-1]&&(--k[0],++p[c-1]);for(h=c-2;0<=h;--h){t=l=0;w=p[h+1];for(q=0;q<a[h];q++)t=m[h+1][w]+m[h+1][w+1],t>e[l]?(m[h][q]=t,g[h][q]=d,w+=2):(m[h][q]=e[l],g[h][q]=l,++l);p[h]=0;1===b[h]&&f(h)}return k} 1][q]=e[q],g[c-1][q]=q;for(l=0;l<c;++l)p[l]=0;1===b[c-1]&&(--k[0],++p[c-1]);for(h=c-2;0<=h;--h){t=l=0;w=p[h+1];for(q=0;q<a[h];q++)t=m[h+1][w]+m[h+1][w+1],t>e[l]?(m[h][q]=t,g[h][q]=d,w+=2):(m[h][q]=e[l],g[h][q]=l,++l);p[h]=0;1===b[h]&&f(h)}return k}
function pa(e){var d=new (C?Uint16Array:Array)(e.length),c=[],f=[],a=0,b,k,m,g;b=0;for(k=e.length;b<k;b++)c[e[b]]=(c[e[b]]|0)+1;b=1;for(k=16;b<=k;b++)f[b]=a,a+=c[b]|0,a<<=1;b=0;for(k=e.length;b<k;b++){a=f[e[b]];f[e[b]]+=1;m=d[b]=0;for(g=e[b];m<g;m++)d[b]=d[b]<<1|a&1,a>>>=1}return d};ba("Zlib.RawDeflate",ka);ba("Zlib.RawDeflate.prototype.compress",ka.prototype.h);var Ka={NONE:0,FIXED:1,DYNAMIC:ma},V,La,$,Ma;if(Object.keys)V=Object.keys(Ka);else for(La in V=[],$=0,Ka)V[$++]=La;$=0;for(Ma=V.length;$<Ma;++$)La=V[$],ba("Zlib.RawDeflate.CompressionType."+La,Ka[La]);}).call(this); //@ sourceMappingURL=rawdeflate.min.js.map function pa(e){var d=new (C?Uint16Array:Array)(e.length),c=[],f=[],a=0,b,k,m,g;b=0;for(k=e.length;b<k;b++)c[e[b]]=(c[e[b]]|0)+1;b=1;for(k=16;b<=k;b++)f[b]=a,a+=c[b]|0,a<<=1;b=0;for(k=e.length;b<k;b++){a=f[e[b]];f[e[b]]+=1;m=d[b]=0;for(g=e[b];m<g;m++)d[b]=d[b]<<1|a&1,a>>>=1}return d};ba("Zlib.RawDeflate",ka);ba("Zlib.RawDeflate.prototype.compress",ka.prototype.h);var Ka={NONE:0,FIXED:1,DYNAMIC:ma},V,La,$,Ma;if(Object.keys)V=Object.keys(Ka);else for(La in V=[],$=0,Ka)V[$++]=La;$=0;for(Ma=V.length;$<Ma;++$)La=V[$],ba("Zlib.RawDeflate.CompressionType."+La,Ka[La]);}).call(this);
},{}],21:[function(require,module,exports){ },{}],20:[function(require,module,exports){
/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';var l=void 0,p=this;function q(c,d){var a=c.split("."),b=p;!(a[0]in b)&&b.execScript&&b.execScript("var "+a[0]);for(var e;a.length&&(e=a.shift());)!a.length&&d!==l?b[e]=d:b=b[e]?b[e]:b[e]={}};var r="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array;function u(c){var d=c.length,a=0,b=Number.POSITIVE_INFINITY,e,f,g,h,k,m,s,n,t;for(n=0;n<d;++n)c[n]>a&&(a=c[n]),c[n]<b&&(b=c[n]);e=1<<a;f=new (r?Uint32Array:Array)(e);g=1;h=0;for(k=2;g<=a;){for(n=0;n<d;++n)if(c[n]===g){m=0;s=h;for(t=0;t<g;++t)m=m<<1|s&1,s>>=1;for(t=m;t<e;t+=k)f[t]=g<<16|n;++h}++g;h<<=1;k<<=1}return[f,a,b]};function v(c,d){this.g=[];this.h=32768;this.c=this.f=this.d=this.k=0;this.input=r?new Uint8Array(c):c;this.l=!1;this.i=w;this.p=!1;if(d||!(d={}))d.index&&(this.d=d.index),d.bufferSize&&(this.h=d.bufferSize),d.bufferType&&(this.i=d.bufferType),d.resize&&(this.p=d.resize);switch(this.i){case x:this.a=32768;this.b=new (r?Uint8Array:Array)(32768+this.h+258);break;case w:this.a=0;this.b=new (r?Uint8Array:Array)(this.h);this.e=this.u;this.m=this.r;this.j=this.s;break;default:throw Error("invalid inflate mode"); /** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';var l=void 0,p=this;function q(c,d){var a=c.split("."),b=p;!(a[0]in b)&&b.execScript&&b.execScript("var "+a[0]);for(var e;a.length&&(e=a.shift());)!a.length&&d!==l?b[e]=d:b=b[e]?b[e]:b[e]={}};var r="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array;function u(c){var d=c.length,a=0,b=Number.POSITIVE_INFINITY,e,f,g,h,k,m,s,n,t;for(n=0;n<d;++n)c[n]>a&&(a=c[n]),c[n]<b&&(b=c[n]);e=1<<a;f=new (r?Uint32Array:Array)(e);g=1;h=0;for(k=2;g<=a;){for(n=0;n<d;++n)if(c[n]===g){m=0;s=h;for(t=0;t<g;++t)m=m<<1|s&1,s>>=1;for(t=m;t<e;t+=k)f[t]=g<<16|n;++h}++g;h<<=1;k<<=1}return[f,a,b]};function v(c,d){this.g=[];this.h=32768;this.c=this.f=this.d=this.k=0;this.input=r?new Uint8Array(c):c;this.l=!1;this.i=w;this.p=!1;if(d||!(d={}))d.index&&(this.d=d.index),d.bufferSize&&(this.h=d.bufferSize),d.bufferType&&(this.i=d.bufferType),d.resize&&(this.p=d.resize);switch(this.i){case x:this.a=32768;this.b=new (r?Uint8Array:Array)(32768+this.h+258);break;case w:this.a=0;this.b=new (r?Uint8Array:Array)(this.h);this.e=this.u;this.m=this.r;this.j=this.s;break;default:throw Error("invalid inflate mode");
}}var x=0,w=1; }}var x=0,w=1;
v.prototype.t=function(){for(;!this.l;){var c=y(this,3);c&1&&(this.l=!0);c>>>=1;switch(c){case 0:var d=this.input,a=this.d,b=this.b,e=this.a,f=l,g=l,h=l,k=b.length,m=l;this.c=this.f=0;f=d[a++];if(f===l)throw Error("invalid uncompressed block header: LEN (first byte)");g=f;f=d[a++];if(f===l)throw Error("invalid uncompressed block header: LEN (second byte)");g|=f<<8;f=d[a++];if(f===l)throw Error("invalid uncompressed block header: NLEN (first byte)");h=f;f=d[a++];if(f===l)throw Error("invalid uncompressed block header: NLEN (second byte)");h|= v.prototype.t=function(){for(;!this.l;){var c=y(this,3);c&1&&(this.l=!0);c>>>=1;switch(c){case 0:var d=this.input,a=this.d,b=this.b,e=this.a,f=l,g=l,h=l,k=b.length,m=l;this.c=this.f=0;f=d[a++];if(f===l)throw Error("invalid uncompressed block header: LEN (first byte)");g=f;f=d[a++];if(f===l)throw Error("invalid uncompressed block header: LEN (second byte)");g|=f<<8;f=d[a++];if(f===l)throw Error("invalid uncompressed block header: NLEN (first byte)");h=f;f=d[a++];if(f===l)throw Error("invalid uncompressed block header: NLEN (second byte)");h|=
@ -2267,7 +2309,7 @@ v.prototype.s=function(c,d){var a=this.b,b=this.a;this.n=c;for(var e=a.length,f,
v.prototype.e=function(){var c=new (r?Uint8Array:Array)(this.a-32768),d=this.a-32768,a,b,e=this.b;if(r)c.set(e.subarray(32768,c.length));else{a=0;for(b=c.length;a<b;++a)c[a]=e[a+32768]}this.g.push(c);this.k+=c.length;if(r)e.set(e.subarray(d,d+32768));else for(a=0;32768>a;++a)e[a]=e[d+a];this.a=32768;return e}; v.prototype.e=function(){var c=new (r?Uint8Array:Array)(this.a-32768),d=this.a-32768,a,b,e=this.b;if(r)c.set(e.subarray(32768,c.length));else{a=0;for(b=c.length;a<b;++a)c[a]=e[a+32768]}this.g.push(c);this.k+=c.length;if(r)e.set(e.subarray(d,d+32768));else for(a=0;32768>a;++a)e[a]=e[d+a];this.a=32768;return e};
v.prototype.u=function(c){var d,a=this.input.length/this.d+1|0,b,e,f,g=this.input,h=this.b;c&&("number"===typeof c.o&&(a=c.o),"number"===typeof c.q&&(a+=c.q));2>a?(b=(g.length-this.d)/this.n[2],f=258*(b/2)|0,e=f<h.length?h.length+f:h.length<<1):e=h.length*a;r?(d=new Uint8Array(e),d.set(h)):d=h;return this.b=d}; v.prototype.u=function(c){var d,a=this.input.length/this.d+1|0,b,e,f,g=this.input,h=this.b;c&&("number"===typeof c.o&&(a=c.o),"number"===typeof c.q&&(a+=c.q));2>a?(b=(g.length-this.d)/this.n[2],f=258*(b/2)|0,e=f<h.length?h.length+f:h.length<<1):e=h.length*a;r?(d=new Uint8Array(e),d.set(h)):d=h;return this.b=d};
v.prototype.m=function(){var c=0,d=this.b,a=this.g,b,e=new (r?Uint8Array:Array)(this.k+(this.a-32768)),f,g,h,k;if(0===a.length)return r?this.b.subarray(32768,this.a):this.b.slice(32768,this.a);f=0;for(g=a.length;f<g;++f){b=a[f];h=0;for(k=b.length;h<k;++h)e[c++]=b[h]}f=32768;for(g=this.a;f<g;++f)e[c++]=d[f];this.g=[];return this.buffer=e}; v.prototype.m=function(){var c=0,d=this.b,a=this.g,b,e=new (r?Uint8Array:Array)(this.k+(this.a-32768)),f,g,h,k;if(0===a.length)return r?this.b.subarray(32768,this.a):this.b.slice(32768,this.a);f=0;for(g=a.length;f<g;++f){b=a[f];h=0;for(k=b.length;h<k;++h)e[c++]=b[h]}f=32768;for(g=this.a;f<g;++f)e[c++]=d[f];this.g=[];return this.buffer=e};
v.prototype.r=function(){var c,d=this.a;r?this.p?(c=new Uint8Array(d),c.set(this.b.subarray(0,d))):c=this.b.subarray(0,d):(this.b.length>d&&(this.b.length=d),c=this.b);return this.buffer=c};q("Zlib.RawInflate",v);q("Zlib.RawInflate.prototype.decompress",v.prototype.t);var T={ADAPTIVE:w,BLOCK:x},U,V,W,X;if(Object.keys)U=Object.keys(T);else for(V in U=[],W=0,T)U[W++]=V;W=0;for(X=U.length;W<X;++W)V=U[W],q("Zlib.RawInflate.BufferType."+V,T[V]);}).call(this); //@ sourceMappingURL=rawinflate.min.js.map v.prototype.r=function(){var c,d=this.a;r?this.p?(c=new Uint8Array(d),c.set(this.b.subarray(0,d))):c=this.b.subarray(0,d):(this.b.length>d&&(this.b.length=d),c=this.b);return this.buffer=c};q("Zlib.RawInflate",v);q("Zlib.RawInflate.prototype.decompress",v.prototype.t);var T={ADAPTIVE:w,BLOCK:x},U,V,W,X;if(Object.keys)U=Object.keys(T);else for(V in U=[],W=0,T)U[W++]=V;W=0;for(X=U.length;W<X;++W)V=U[W],q("Zlib.RawInflate.BufferType."+V,T[V]);}).call(this);
},{}]},{},[7]) },{}]},{},[7])
(7) (7)

View File

@ -2261,6 +2261,23 @@ body { padding-bottom: 70px; }
<span class="sr-only">60% Complete</span> <span class="sr-only">60% Complete</span>
</div> </div>
</div> </div>
{% endhighlight %}
<h3 id="progress-label">With label</h3>
<p>Remove the <code>.sr-only</code> class from within the progress bar to show a visible percentage. For low percentages, consider adding a <code>min-width</code> to ensure the label's text is fully visible.</p>
<div class="bs-example">
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;">
60%
</div>
</div>
</div>
{% highlight html %}
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;">
60%
</div>
</div>
{% endhighlight %} {% endhighlight %}
<h3 id="progress-alternatives">Contextual alternatives</h3> <h3 id="progress-alternatives">Contextual alternatives</h3>

View File

@ -76,11 +76,6 @@ lead: "Global CSS settings, fundamental HTML elements styled and enhanced with e
</ul> </ul>
<p>Look to the examples for applying these principles to your code.</p> <p>Look to the examples for applying these principles to your code.</p>
<div class="bs-callout bs-callout-info">
<h4>Grids and full-width layouts</h4>
<p>Folks looking to create fully fluid layouts (meaning your site stretches the entire width of the viewport) must wrap their grid content in a containing element with <code>padding: 0 15px;</code> to offset the <code>margin: 0 -15px;</code> used on <code>.row</code>s.</p>
</div>
<h3 id="grid-media-queries">Media queries</h3> <h3 id="grid-media-queries">Media queries</h3>
<p>We use the following media queries in our Less files to create the key breakpoints in our grid system.</p> <p>We use the following media queries in our Less files to create the key breakpoints in our grid system.</p>
{% highlight scss %} {% highlight scss %}
@ -3245,7 +3240,7 @@ a {
<p>Easily truncate text with an ellipsis with a single mixin. <strong>Requires element to be <code>block</code> or <code>inline-block</code> level.</strong></p> <p>Easily truncate text with an ellipsis with a single mixin. <strong>Requires element to be <code>block</code> or <code>inline-block</code> level.</strong></p>
{% highlight scss %} {% highlight scss %}
// Mixin // Mixin
.text-truncate() { .text-overflow() {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
@ -3255,7 +3250,7 @@ a {
.branch-name { .branch-name {
display: inline-block; display: inline-block;
max-width: 200px; max-width: 200px;
.text-truncate(); .text-overflow();
} }
{% endhighlight %} {% endhighlight %}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -29,12 +29,14 @@ body {
@media (min-width: 768px) { @media (min-width: 768px) {
.sidebar { .sidebar {
position: fixed; position: fixed;
top: 0; top: 51px;
bottom: 0; bottom: 0;
left: 0; left: 0;
z-index: 1000; z-index: 1000;
display: block; display: block;
padding: 70px 20px 20px; padding: 20px;
overflow-x: hidden;
overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
background-color: #f5f5f5; background-color: #f5f5f5;
border-right: 1px solid #eee; border-right: 1px solid #eee;
} }

View File

@ -1,5 +1,5 @@
$(document).ready(function () { $(document).ready(function () {
$('[data-toggle=offcanvas]').click(function () { $('[data-toggle=offcanvas]').click(function () {
$('.row-offcanvas').toggleClass('active'); $('.row-offcanvas').toggleClass('active')
}); });
}); });

View File

@ -28,9 +28,6 @@
<body> <body>
<!-- Wrap all page content here -->
<div id="wrap">
<!-- Fixed navbar --> <!-- Fixed navbar -->
<div class="navbar navbar-default navbar-fixed-top" role="navigation"> <div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container"> <div class="container">
@ -70,10 +67,9 @@
<div class="page-header"> <div class="page-header">
<h1>Sticky footer with fixed navbar</h1> <h1>Sticky footer with fixed navbar</h1>
</div> </div>
<p class="lead">Pin a fixed-height footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS. A fixed navbar has been added within <code>#wrap</code> with <code>padding-top: 60px;</code> on the <code>.container</code>.</p> <p class="lead">Pin a fixed-height footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS. A fixed navbar has been added with <code>padding-top: 60px;</code> on the <code>body > .container</code>.</p>
<p>Back to <a href="../sticky-footer">the default sticky footer</a> minus the navbar.</p> <p>Back to <a href="../sticky-footer">the default sticky footer</a> minus the navbar.</p>
</div> </div>
</div>
<div id="footer"> <div id="footer">
<div class="container"> <div class="container">

View File

@ -1,24 +1,18 @@
/* Sticky footer styles /* Sticky footer styles
-------------------------------------------------- */ -------------------------------------------------- */
html {
html, position: relative;
body {
height: 100%;
/* The html and body elements cannot have any padding or margin. */
}
/* Wrapper for page content to push down footer */
#wrap {
height: auto;
min-height: 100%; min-height: 100%;
/* Pad bottom by footer height */
padding: 0 0 60px;
/* Negative indent footer by its height */
margin: 0 auto -60px;
} }
body {
/* Set the fixed height of the footer here */ /* Margin bottom by footer height */
margin-bottom: 60px;
}
#footer { #footer {
position: absolute;
bottom: 0;
width: 100%;
/* Set the fixed height of the footer here */
height: 60px; height: 60px;
background-color: #f5f5f5; background-color: #f5f5f5;
} }
@ -28,7 +22,7 @@ body {
-------------------------------------------------- */ -------------------------------------------------- */
/* Not required for template or sticky footer method. */ /* Not required for template or sticky footer method. */
#wrap > .container { body > .container {
padding: 60px 15px 0; padding: 60px 15px 0;
} }
.container .text-muted { .container .text-muted {

View File

@ -28,9 +28,6 @@
<body> <body>
<!-- Wrap all page content here -->
<div id="wrap">
<!-- Begin page content --> <!-- Begin page content -->
<div class="container"> <div class="container">
<div class="page-header"> <div class="page-header">
@ -39,7 +36,6 @@
<p class="lead">Pin a fixed-height footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS.</p> <p class="lead">Pin a fixed-height footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS.</p>
<p>Use <a href="../sticky-footer-navbar">the sticky footer with a fixed navbar</a> if need be, too.</p> <p>Use <a href="../sticky-footer-navbar">the sticky footer with a fixed navbar</a> if need be, too.</p>
</div> </div>
</div>
<div id="footer"> <div id="footer">
<div class="container"> <div class="container">

View File

@ -1,24 +1,18 @@
/* Sticky footer styles /* Sticky footer styles
-------------------------------------------------- */ -------------------------------------------------- */
html {
html, position: relative;
body {
height: 100%;
/* The html and body elements cannot have any padding or margin. */
}
/* Wrapper for page content to push down footer */
#wrap {
height: auto;
min-height: 100%; min-height: 100%;
/* Pad bottom by footer height */
padding: 0 0 60px;
/* Negative indent footer by its height */
margin: 0 auto -60px;
} }
body {
/* Set the fixed height of the footer here */ /* Margin bottom by footer height */
margin-bottom: 60px;
}
#footer { #footer {
position: absolute;
bottom: 0;
width: 100%;
/* Set the fixed height of the footer here */
height: 60px; height: 60px;
background-color: #f5f5f5; background-color: #f5f5f5;
} }

View File

@ -369,7 +369,7 @@ bootstrap/
<p class="lead">Bootstrap is built to work best in the latest desktop and mobile browsers, meaning older browsers might display differently styled, though fully functional, renderings of certain components.</p> <p class="lead">Bootstrap is built to work best in the latest desktop and mobile browsers, meaning older browsers might display differently styled, though fully functional, renderings of certain components.</p>
<h3 id="support-browsers">Supported browsers</h3> <h3 id="support-browsers">Supported browsers</h3>
<p>Specifically, we support the <strong>latest versions</strong> of the following browsers and platforms:</p> <p>Specifically, we support the <strong>latest versions</strong> of the following browsers and platforms. On Windows, <strong>we support Internet Explorer 8-11</strong>. More specific support information is provided below.</p>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-bordered table-striped"> <table class="table table-bordered table-striped">
<thead> <thead>
@ -543,10 +543,10 @@ if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
<p>On <code>&lt;select&gt;</code> elements, the Android stock browser will not display the side controls if there is a <code>border-radius</code> and/or <code>border</code> applied. Use the snippet of code below to remove the offending CSS and render the <code>&lt;select&gt;</code> as an unstyled element on the Android stock browser. The user agent sniffing avoids interference with Chrome, Safari, and Mozilla browsers.</p> <p>On <code>&lt;select&gt;</code> elements, the Android stock browser will not display the side controls if there is a <code>border-radius</code> and/or <code>border</code> applied. Use the snippet of code below to remove the offending CSS and render the <code>&lt;select&gt;</code> as an unstyled element on the Android stock browser. The user agent sniffing avoids interference with Chrome, Safari, and Mozilla browsers.</p>
{% highlight html %} {% highlight html %}
<script> <script>
var nua = navigator.userAgent; var nua = navigator.userAgent
var isAndroid = (nua.indexOf('Mozilla/5.0') > -1 && nua.indexOf('Android ') > -1 && nua.indexOf('AppleWebKit') > -1 && nua.indexOf('Chrome') === -1); var isAndroid = (nua.indexOf('Mozilla/5.0') > -1 && nua.indexOf('Android ') > -1 && nua.indexOf('AppleWebKit') > -1 && nua.indexOf('Chrome') === -1)
if (isAndroid) { if (isAndroid) {
$('select.form-control').removeClass('form-control').css('width', '100%'); $('select.form-control').removeClass('form-control').css('width', '100%')
} }
</script> </script>
{% endhighlight %} {% endhighlight %}
@ -769,6 +769,7 @@ if (isAndroid) {
<li><a href="http://www.oneskyapp.com/docs/bootstrap/ru">Bootstrap по-русски (Russian)</a></li> <li><a href="http://www.oneskyapp.com/docs/bootstrap/ru">Bootstrap по-русски (Russian)</a></li>
<li><a href="http://www.oneskyapp.com/docs/bootstrap/es">Bootstrap en Español (Spanish)</a></li> <li><a href="http://www.oneskyapp.com/docs/bootstrap/es">Bootstrap en Español (Spanish)</a></li>
<li><a href="http://twbs.site-konstruktor.com.ua">Bootstrap ua Українською (Ukrainian)</a></li> <li><a href="http://twbs.site-konstruktor.com.ua">Bootstrap ua Українською (Ukrainian)</a></li>
<li><a href="http://bootstrapk.com/BS3/">Bootstrap 한국어 (Korean)</a></li>
</ul> </ul>
<p>Have another language to add, or perhaps a different or better translation? Let us know by <a href="https://github.com/twbs/bootstrap/issues/new">opening an issue</a>.</p> <p>Have another language to add, or perhaps a different or better translation? Let us know by <a href="https://github.com/twbs/bootstrap/issues/new">opening an issue</a>.</p>
</div> </div>

View File

@ -15,8 +15,13 @@ lead: "Bring Bootstrap's components to life with over a dozen custom jQuery plug
<p>Plugins can be included individually (using Bootstrap's individual <code>*.js</code> files), or all at once (using <code>bootstrap.js</code> or the minified <code>bootstrap.min.js</code>).</p> <p>Plugins can be included individually (using Bootstrap's individual <code>*.js</code> files), or all at once (using <code>bootstrap.js</code> or the minified <code>bootstrap.min.js</code>).</p>
<div class="bs-callout bs-callout-danger"> <div class="bs-callout bs-callout-danger">
<h4>Do not attempt to include both.</h4> <h4>Using the compiled JavaScript</h4>
<p>Both <code>bootstrap.js</code> and <code>bootstrap.min.js</code> contain all plugins in a single file.</p> <p>Both <code>bootstrap.js</code> and <code>bootstrap.min.js</code> contain all plugins in a single file. Include only one.</p>
</div>
<div class="bs-callout bs-callout-danger">
<h4>Component data attributes</h4>
<p>Don't mix data attributes from separate plugins on the same component. For example, a button cannot have a tooltip and toggle a modal. To accomplish this, use a wrapping element.</p>
</div> </div>
<div class="bs-callout bs-callout-danger"> <div class="bs-callout bs-callout-danger">
@ -561,6 +566,7 @@ $('.dropdown-toggle').dropdown()
<p>Toggles the dropdown menu of a given navbar or tabbed navigation.</p> <p>Toggles the dropdown menu of a given navbar or tabbed navigation.</p>
<h3>Events</h3> <h3>Events</h3>
<p>All dropdown events are fired at the <code>.dropdown-menu</code>'s parent element.</p>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-bordered table-striped"> <table class="table table-bordered table-striped">
<thead> <thead>
@ -1438,10 +1444,10 @@ $('#my-alert').bind('closed.bs.alert', function () {
</button> </button>
<script> <script>
$('#loading-example-btn').click(function () { $('#loading-example-btn').click(function () {
var btn = $(this); var btn = $(this)
btn.button('loading'); btn.button('loading')
$.ajax(...).always(function () { $.ajax(...).always(function () {
btn.button('reset'); btn.button('reset')
}); });
}); });
</script> </script>
@ -1546,10 +1552,10 @@ $('.btn').button()
<button id="loading-example-btn" type="button" class="btn btn-primary" data-loading-text="loading stuff...">...</button> <button id="loading-example-btn" type="button" class="btn btn-primary" data-loading-text="loading stuff...">...</button>
<script> <script>
$('#loading-example-btn').click(function () { $('#loading-example-btn').click(function () {
var btn = $(this); var btn = $(this)
btn.button('loading'); btn.button('loading')
$.ajax(...).always(function () { $.ajax(...).always(function () {
btn.button('reset'); btn.button('reset')
}); });
}); });
</script> </script>

View File

@ -1,4 +1,3 @@
/* jshint node: true */
/*! /*!
* Bootstrap Grunt task for Glyphicons data generation * Bootstrap Grunt task for Glyphicons data generation
* http://getbootstrap.com * http://getbootstrap.com

View File

@ -1,4 +1,3 @@
/* jshint node: true */
/*! /*!
* Bootstrap Grunt task for parsing Less docstrings * Bootstrap Grunt task for parsing Less docstrings
* http://getbootstrap.com * http://getbootstrap.com

View File

@ -1,4 +1,5 @@
/* jshint node: true */ /* global btoa: true */
/*! /*!
* Bootstrap Grunt task for generating raw-files.min.js for the Customizer * Bootstrap Grunt task for generating raw-files.min.js for the Customizer
* http://getbootstrap.com * http://getbootstrap.com
@ -6,7 +7,7 @@
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/ */
var btoa = require('btoa') // jshint ignore:line var btoa = require('btoa')
var fs = require('fs') var fs = require('fs')
function getFiles(type) { function getFiles(type) {

View File

@ -1,5 +1,3 @@
/* jshint node: true */
/* /*
This Grunt task updates the npm-shrinkwrap.canonical.json file that's used as the key for Bootstrap's npm packages cache. This Grunt task updates the npm-shrinkwrap.canonical.json file that's used as the key for Bootstrap's npm packages cache.
This task should be run and the updated file should be committed whenever Bootstrap's dependencies change. This task should be run and the updated file should be committed whenever Bootstrap's dependencies change.

View File

@ -96,9 +96,9 @@
// //
// Remix the default button sizing classes into new ones for easier manipulation. // Remix the default button sizing classes into new ones for easier manipulation.
.btn-group-xs > .btn { .btn-xs(); } .btn-group-xs > .btn { &:extend(.btn-xs); }
.btn-group-sm > .btn { .btn-sm(); } .btn-group-sm > .btn { &:extend(.btn-sm); }
.btn-group-lg > .btn { .btn-lg(); } .btn-group-lg > .btn { &:extend(.btn-lg); }
// Split button dropdowns // Split button dropdowns

View File

@ -21,7 +21,7 @@
// Account for jankitude on images // Account for jankitude on images
> img, > img,
> a > img { > a > img {
.img-responsive(); &:extend(.img-responsive);
line-height: 1; line-height: 1;
} }
} }

View File

@ -133,9 +133,10 @@ output {
.placeholder(); .placeholder();
// Disabled and read-only inputs // Disabled and read-only inputs
// Note: HTML5 says that controls under a fieldset > legend:first-child won't //
// be disabled if the fieldset is disabled. Due to implementation difficulty, // HTML5 says that controls under a fieldset > legend:first-child won't be
// we don't honor that edge case; we style them as disabled anyway. // disabled if the fieldset is disabled. Due to implementation difficulty, we
// don't honor that edge case; we style them as disabled anyway.
&[disabled], &[disabled],
&[readonly], &[readonly],
fieldset[disabled] & { fieldset[disabled] & {
@ -150,10 +151,24 @@ output {
} }
} }
// Search inputs in iOS
//
// This overrides the extra rounded corners on search inputs in iOS so that our
// `.form-control` class can properly style them. Note that this cannot simply
// be added to `.form-control` as it's not specific enough. For details, see
// https://github.com/twbs/bootstrap/issues/11586.
input[type="search"] {
-webkit-appearance: none;
}
// Special styles for iOS date input // Special styles for iOS date input
// //
// In Mobile Safari, date inputs require a pixel line-height that matches the // In Mobile Safari, date inputs require a pixel line-height that matches the
// given height of the input. // given height of the input.
input[type="date"] { input[type="date"] {
line-height: @input-height-base; line-height: @input-height-base;
} }
@ -334,6 +349,10 @@ input[type="checkbox"],
width: auto; // Prevent labels from stacking above inputs in `.form-group` width: auto; // Prevent labels from stacking above inputs in `.form-group`
vertical-align: middle; vertical-align: middle;
} }
// Input groups need that 100% width though
.input-group > .form-control {
width: 100%;
}
.control-label { .control-label {
margin-bottom: 0; margin-bottom: 0;

View File

@ -54,8 +54,7 @@
// Placeholder text // Placeholder text
.placeholder(@color: @input-color-placeholder) { .placeholder(@color: @input-color-placeholder) {
&:-moz-placeholder { color: @color; } // Firefox 4-18 &::-moz-placeholder { color: @color; // Firefox
&::-moz-placeholder { color: @color; // Firefox 19+
opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526 opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526
&:-ms-input-placeholder { color: @color; } // Internet Explorer 10+ &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+
&::-webkit-input-placeholder { color: @color; } // Safari and Chrome &::-webkit-input-placeholder { color: @color; } // Safari and Chrome
@ -253,7 +252,6 @@
-webkit-user-select: @select; -webkit-user-select: @select;
-moz-user-select: @select; -moz-user-select: @select;
-ms-user-select: @select; // IE10+ -ms-user-select: @select; // IE10+
-o-user-select: @select;
user-select: @select; user-select: @select;
} }

View File

@ -18,6 +18,37 @@
&:extend(.clearfix all); &:extend(.clearfix all);
} }
// Optional heading
.panel-heading {
padding: 10px 15px;
border-bottom: 1px solid transparent;
.border-top-radius((@panel-border-radius - 1));
> .dropdown .dropdown-toggle {
color: inherit;
}
}
// Within heading, strip any `h*` tag of its default margins for spacing.
.panel-title {
margin-top: 0;
margin-bottom: 0;
font-size: ceil((@font-size-base * 1.125));
color: inherit;
> a {
color: inherit;
}
}
// Optional footer (stays gray in every modifier class)
.panel-footer {
padding: 10px 15px;
background-color: @panel-footer-bg;
border-top: 1px solid @panel-inner-border;
.border-bottom-radius((@panel-border-radius - 1));
}
// List groups in panels // List groups in panels
// //
@ -130,12 +161,22 @@
> td:last-child { > td:last-child {
border-right: 0; border-right: 0;
} }
&:first-child > th,
&:first-child > td {
border-top: 0;
} }
&:last-child > th, }
&:last-child > td { > thead,
> tbody {
> tr:first-child {
> td,
> th {
border-bottom: 0;
}
}
}
> tbody,
> tfoot {
> tr:last-child {
> td,
> th {
border-bottom: 0; border-bottom: 0;
} }
} }
@ -148,38 +189,6 @@
} }
// Optional heading
.panel-heading {
padding: 10px 15px;
border-bottom: 1px solid transparent;
.border-top-radius((@panel-border-radius - 1));
> .dropdown .dropdown-toggle {
color: inherit;
}
}
// Within heading, strip any `h*` tag of its default margins for spacing.
.panel-title {
margin-top: 0;
margin-bottom: 0;
font-size: ceil((@font-size-base * 1.125));
color: inherit;
> a {
color: inherit;
}
}
// Optional footer (stays gray in every modifier class)
.panel-footer {
padding: 10px 15px;
background-color: @panel-footer-bg;
border-top: 1px solid @panel-inner-border;
.border-bottom-radius((@panel-border-radius - 1));
}
// Collapsable panels (aka, accordion) // Collapsable panels (aka, accordion)
// //
// Wrap a series of panels in `.panel-group` to turn them into an accordion with // Wrap a series of panels in `.panel-group` to turn them into an accordion with

View File

@ -16,7 +16,7 @@
> img, > img,
a > img { a > img {
.img-responsive(); &:extend(.img-responsive);
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
} }

View File

@ -233,7 +233,7 @@ abbr[data-original-title] {
blockquote { blockquote {
padding: (@line-height-computed / 2) @line-height-computed; padding: (@line-height-computed / 2) @line-height-computed;
margin: 0 0 @line-height-computed; margin: 0 0 @line-height-computed;
font-size: (@font-size-base * 1.25); font-size: @blockquote-font-size;
border-left: 5px solid @blockquote-border-color; border-left: 5px solid @blockquote-border-color;
p, p,

View File

@ -301,6 +301,26 @@
@grid-float-breakpoint-max: (@grid-float-breakpoint - 1); @grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
//== Container sizes
//
//## Define the maximum width of `.container` for different screen sizes.
// Small screen / tablet
@container-tablet: ((720px + @grid-gutter-width));
//** For `@screen-sm-min` and up.
@container-sm: @container-tablet;
// Medium screen / desktop
@container-desktop: ((940px + @grid-gutter-width));
//** For `@screen-md-min` and up.
@container-md: @container-desktop;
// Large screen / wide desktop
@container-large-desktop: ((1140px + @grid-gutter-width));
//** For `@screen-lg-min` and up.
@container-lg: @container-large-desktop;
//== Navbar //== Navbar
// //
//## //##
@ -790,6 +810,8 @@
@headings-small-color: @gray-light; @headings-small-color: @gray-light;
//** Blockquote small color //** Blockquote small color
@blockquote-small-color: @gray-light; @blockquote-small-color: @gray-light;
//** Blockquote font size
@blockquote-font-size: (@font-size-base * 1.25);
//** Blockquote border color //** Blockquote border color
@blockquote-border-color: @gray-lighter; @blockquote-border-color: @gray-lighter;
//** Page header border color //** Page header border color
@ -805,23 +827,3 @@
//** Horizontal offset for forms and lists. //** Horizontal offset for forms and lists.
@component-offset-horizontal: 180px; @component-offset-horizontal: 180px;
//== Container sizes
//
//## Define the maximum width of `.container` for different screen sizes.
// Small screen / tablet
@container-tablet: ((720px + @grid-gutter-width));
//** For `@screen-sm-min` and up.
@container-sm: @container-tablet;
// Medium screen / desktop
@container-desktop: ((940px + @grid-gutter-width));
//** For `@screen-md-min` and up.
@container-md: @container-desktop;
// Large screen / wide desktop
@container-large-desktop: ((1140px + @grid-gutter-width));
//** For `@screen-lg-min` and up.
@container-lg: @container-large-desktop;

View File

@ -20,12 +20,10 @@
"bugs": { "bugs": {
"url": "https://github.com/twbs/bootstrap/issues" "url": "https://github.com/twbs/bootstrap/issues"
}, },
"licenses": [ "license": {
{
"type": "MIT", "type": "MIT",
"url": "https://github.com/twbs/bootstrap/blob/master/LICENSE" "url": "https://github.com/twbs/bootstrap/blob/master/LICENSE"
} },
],
"devDependencies": { "devDependencies": {
"browserstack-runner": "~0.1.0", "browserstack-runner": "~0.1.0",
"btoa": "~1.1.1", "btoa": "~1.1.1",

File diff suppressed because one or more lines are too long