Commit 918b2a49 authored by Thomas Park's avatar Thomas Park
Browse files

3.2.0 -> 3.3.0

parent 5c12c8a9
This diff is collapsed.
This diff is collapsed.
// Amelia 3.2.0
// Bootswatch
// -----------------------------------------------------
@import url("//fonts.googleapis.com/css?family=Lobster|Cabin:400,700");
// Navbar =====================================================================
.navbar {
&-brand {
font-family: 'Lobster', cursive;
}
&-default {
.badge {
background-color: #fff;
color: @navbar-default-bg;
}
}
}
// Buttons ====================================================================
.btn {
.caret {
border-top-color: #fff;
}
}
.btn-default {
&:hover {
color: @btn-default-color;
}
.caret {
border-top-color: @btn-default-color;
}
}
// Typography =================================================================
.text-primary,
.text-primary:hover {
color: lighten(@brand-primary, 40%);
}
.text-success,
.text-success:hover {
color: lighten(@brand-success, 20%);
}
.text-danger,
.text-danger:hover {
color: lighten(@brand-danger, 20%);
}
.text-warning,
.text-warning:hover {
color: lighten(@brand-warning, 20%);
}
.text-info,
.text-info:hover {
color: lighten(@brand-info, 40%);
}
// Tables =====================================================================
.table-responsive > .table {
background-color: @table-bg;
}
table,
.table {
a:not(.btn) {
color: #fff;
text-decoration: underline;
}
.text-muted {
color: @text-muted;
}
}
// Forms ======================================================================
input,
textarea {
color: @input-color;
}
legend {
font-family: 'Lobster', cursive;
color: #fff;
}
.input-group-addon {
color: @btn-default-color;
}
.has-warning {
.help-block,
.control-label,
.form-control-feedback {
color: lighten(@brand-warning, 20%);
}
.form-control,
.form-control:focus {
border-color: lighten(@brand-warning, 20%);
}
.input-group-addon {
border: none;
}
}
.has-error {
.help-block,
.control-label,
.form-control-feedback {
color: lighten(@brand-primary, 40%);
}
.form-control,
.form-control:focus {
border-color: lighten(@brand-primary, 40%);
}
.input-group-addon {
border: none;
}
}
.has-success {
.help-block,
.control-label,
.form-control-feedback {
color: lighten(@brand-success, 20%);
}
.form-control,
.form-control:focus {
border-color: lighten(@brand-success, 20%);
}
.input-group-addon {
border: none;
}
}
// Navs =======================================================================
.pagination {
a:hover {
color: #fff;
}
}
.pager {
a:hover {
color: #fff;
}
}
// Indicators =================================================================
.close {
opacity: 0.4;
&:hover,
&:focus {
opacity: 1;
}
}
// Progress bars ==============================================================
// Containers =================================================================
a.thumbnail:hover,
a.thumbnail:focus,
a.thumbnail.active {
border-color: @thumbnail-border;
}
This diff is collapsed.
This diff is collapsed.
{
"version": "3.2.0",
"version": "3.3.0",
"themes": [
{
"name": "Amelia",
"description": "Sweet and cheery",
"thumbnail": "http://bootswatch.com/amelia/thumbnail.png",
"preview": "http://bootswatch.com/amelia/",
"css": "http://bootswatch.com/amelia/bootstrap.css",
"cssMin": "http://bootswatch.com/amelia/bootstrap.min.css",
"cssCdn": "//netdna.bootstrapcdn.com/bootswatch/latest/amelia/bootstrap.min.css",
"less": "http://bootswatch.com/amelia/bootswatch.less",
"lessVariables": "http://bootswatch.com/amelia/variables.less"
},
{
"name": "Cerulean",
"description": "A calm blue sky",
......
{
"name": "bootswatch",
"description": "Bootswatch is a collection of themes for Bootstrap.",
"version": "3.2.0",
"version": "3.3.0",
"author": "Thomas Park",
"homepage": "http://bootswatch.com",
"repository": {
......@@ -32,7 +32,7 @@
"*/index.html"
],
"dependencies": {
"bootstrap": "~3.2.0"
"bootstrap": "~3.3.0"
},
"devDependencies": {
"font-awesome": "~4.0.0",
......
{
"name": "bootstrap",
"description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
"version": "3.2.0",
"version": "3.3.0",
"keywords": [
"css",
"js",
......@@ -23,7 +23,7 @@
"dist/fonts/glyphicons-halflings-regular.woff"
],
"ignore": [
".*",
"/.*",
"_config.yml",
"CNAME",
"composer.json",
......@@ -33,15 +33,16 @@
"test-infra"
],
"dependencies": {
"jquery": ">= 1.9.0"
"jquery": ">= 1.9.1"
},
"_release": "3.2.0",
"_release": "3.3.0",
"_resolution": {
"type": "version",
"tag": "v3.2.0",
"commit": "c068162161154a4b85110ea1e7dd3d7897ce2b72"
"tag": "v3.3.0",
"commit": "16dbdbd7a2c6cfa3be4e5dcc52249e577c02c84a"
},
"_source": "git://github.com/twbs/bootstrap.git",
"_target": "~3.2.0",
"_originalSource": "bootstrap"
"_target": "~3.3.0",
"_originalSource": "bootstrap",
"_direct": true
}
\ No newline at end of file
......@@ -18,9 +18,15 @@ module.exports = function (grunt) {
var fs = require('fs');
var path = require('path');
var npmShrinkwrap = require('npm-shrinkwrap');
var generateGlyphiconsData = require('./grunt/bs-glyphicons-data-generator.js');
var BsLessdocParser = require('./grunt/bs-lessdoc-parser.js');
var getLessVarsData = function () {
var filePath = path.join(__dirname, 'less/variables.less');
var fileContent = fs.readFileSync(filePath, { encoding: 'utf8' });
var parser = new BsLessdocParser(fileContent);
return { sections: parser.parseFile() };
};
var generateRawFiles = require('./grunt/bs-raw-files-generator.js');
var generateCommonJSModule = require('./grunt/bs-commonjs-generator.js');
// Project configuration.
grunt.initConfig({
......@@ -32,12 +38,26 @@ module.exports = function (grunt) {
' * Copyright 2011-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
' * Licensed under <%= pkg.license.type %> (<%= pkg.license.url %>)\n' +
' */\n',
// NOTE: This jqueryCheck code is duplicated in customizer.js; if making changes here, be sure to update the other copy too.
jqueryCheck: 'if (typeof jQuery === \'undefined\') { throw new Error(\'Bootstrap\\\'s JavaScript requires jQuery\') }\n\n',
// NOTE: This jqueryCheck/jqueryVersionCheck code is duplicated in customizer.js;
// if making changes here, be sure to update the other copy too.
jqueryCheck: [
'if (typeof jQuery === \'undefined\') {',
' throw new Error(\'Bootstrap\\\'s JavaScript requires jQuery\')',
'}\n'
].join('\n'),
jqueryVersionCheck: [
'+function ($) {',
' var version = $.fn.jquery.split(\' \')[0].split(\'.\')',
' if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {',
' throw new Error(\'Bootstrap\\\'s JavaScript requires jQuery version 1.9.1 or higher\')',
' }',
'}(jQuery);\n\n'
].join('\n'),
// Task configuration.
clean: {
dist: ['dist', 'docs/dist']
dist: 'dist',
docs: 'docs/dist'
},
jshint: {
......@@ -50,7 +70,7 @@ module.exports = function (grunt) {
},
src: ['Gruntfile.js', 'grunt/*.js']
},
src: {
core: {
src: 'js/*.js'
},
test: {
......@@ -60,7 +80,7 @@ module.exports = function (grunt) {
src: 'js/tests/unit/*.js'
},
assets: {
src: ['docs/assets/js/_src/*.js', 'docs/assets/js/*.js', '!docs/assets/js/*.min.js']
src: ['docs/assets/js/src/*.js', 'docs/assets/js/*.js', '!docs/assets/js/*.min.js']
}
},
......@@ -71,8 +91,8 @@ module.exports = function (grunt) {
grunt: {
src: '<%= jshint.grunt.src %>'
},
src: {
src: '<%= jshint.src.src %>'
core: {
src: '<%= jshint.core.src %>'
},
test: {
src: '<%= jshint.test.src %>'
......@@ -87,7 +107,7 @@ module.exports = function (grunt) {
concat: {
options: {
banner: '<%= banner %>\n<%= jqueryCheck %>',
banner: '<%= banner %>\n<%= jqueryCheck %>\n<%= jqueryVersionCheck %>',
stripBanners: false
},
bootstrap: {
......@@ -113,27 +133,29 @@ module.exports = function (grunt) {
options: {
preserveComments: 'some'
},
bootstrap: {
core: {
src: '<%= concat.bootstrap.dest %>',
dest: 'dist/js/<%= pkg.name %>.min.js'
},
customize: {
// NOTE: This src list is duplicated in footer.html; if making changes here, be sure to update the other copy too.
src: [
'docs/assets/js/_vendor/less.min.js',
'docs/assets/js/_vendor/jszip.min.js',
'docs/assets/js/_vendor/uglify.min.js',
'docs/assets/js/_vendor/blob.js',
'docs/assets/js/_vendor/filesaver.js',
'docs/assets/js/vendor/less.min.js',
'docs/assets/js/vendor/jszip.min.js',
'docs/assets/js/vendor/uglify.min.js',
'docs/assets/js/vendor/Blob.js',
'docs/assets/js/vendor/FileSaver.js',
'docs/assets/js/raw-files.min.js',
'docs/assets/js/_src/customizer.js'
'docs/assets/js/src/customizer.js'
],
dest: 'docs/assets/js/customize.min.js'
},
docsJs: {
// NOTE: This src list is duplicated in footer.html; if making changes here, be sure to update the other copy too.
src: [
'docs/assets/js/_vendor/holder.js',
'docs/assets/js/_vendor/ZeroClipboard.min.js',
'docs/assets/js/_src/application.js'
'docs/assets/js/vendor/holder.js',
'docs/assets/js/vendor/ZeroClipboard.min.js',
'docs/assets/js/src/application.js'
],
dest: 'docs/assets/js/docs.min.js'
}
......@@ -155,9 +177,8 @@ module.exports = function (grunt) {
sourceMapURL: '<%= pkg.name %>.css.map',
sourceMapFilename: 'dist/css/<%= pkg.name %>.css.map'
},
files: {
'dist/css/<%= pkg.name %>.css': 'less/bootstrap.less'
}
src: 'less/bootstrap.less',
dest: 'dist/css/<%= pkg.name %>.css'
},
compileTheme: {
options: {
......@@ -167,9 +188,8 @@ module.exports = function (grunt) {
sourceMapURL: '<%= pkg.name %>-theme.css.map',
sourceMapFilename: 'dist/css/<%= pkg.name %>-theme.css.map'
},
files: {
'dist/css/<%= pkg.name %>-theme.css': 'less/theme.less'
}
src: 'less/theme.less',
dest: 'dist/css/<%= pkg.name %>-theme.css'
}
},
......@@ -199,7 +219,7 @@ module.exports = function (grunt) {
src: 'dist/css/<%= pkg.name %>-theme.css'
},
docs: {
src: 'docs/assets/css/_src/docs.css'
src: 'docs/assets/css/src/docs.css'
},
examples: {
expand: true,
......@@ -213,7 +233,7 @@ module.exports = function (grunt) {
options: {
csslintrc: 'less/.csslintrc'
},
src: [
dist: [
'dist/css/bootstrap.css',
'dist/css/bootstrap-theme.css'
],
......@@ -225,7 +245,7 @@ module.exports = function (grunt) {
ids: false,
'overqualified-elements': false
},
src: 'docs/assets/css/_src/docs.css'
src: 'docs/assets/css/src/docs.css'
}
},
......@@ -235,16 +255,18 @@ module.exports = function (grunt) {
keepSpecialComments: '*',
noAdvanced: true
},
core: {
files: {
'dist/css/<%= pkg.name %>.min.css': 'dist/css/<%= pkg.name %>.css',
'dist/css/<%= pkg.name %>-theme.min.css': 'dist/css/<%= pkg.name %>-theme.css'
}
minifyCore: {
src: 'dist/css/<%= pkg.name %>.css',
dest: 'dist/css/<%= pkg.name %>.min.css'
},
minifyTheme: {
src: 'dist/css/<%= pkg.name %>-theme.css',
dest: 'dist/css/<%= pkg.name %>-theme.min.css'
},
docs: {
src: [
'docs/assets/css/_src/docs.css',
'docs/assets/css/_src/pygments-manni.css'
'docs/assets/css/src/docs.css',
'docs/assets/css/src/pygments-manni.css'
],
dest: 'docs/assets/css/docs.min.css'
}
......@@ -277,27 +299,19 @@ module.exports = function (grunt) {
dest: 'docs/examples/'
},
docs: {
files: {
'docs/assets/css/_src/docs.css': 'docs/assets/css/_src/docs.css'
}
src: 'docs/assets/css/src/docs.css',
dest: 'docs/assets/css/src/docs.css'
}
},
copy: {
fonts: {
expand: true,
src: 'fonts/*',
dest: 'dist/'
},
docs: {
expand: true,
cwd: './dist',
src: [
'{css,js}/*.min.*',
'css/*.map',
'fonts/*'
],
dest: 'docs/dist'
src: 'dist/*/*',
dest: 'docs/'
}
},
......@@ -315,20 +329,17 @@ module.exports = function (grunt) {
},
jade: {
compile: {
options: {
pretty: true,
data: function () {
var filePath = path.join(__dirname, 'less/variables.less');
var fileContent = fs.readFileSync(filePath, { encoding: 'utf8' });
var parser = new BsLessdocParser(fileContent);
return { sections: parser.parseFile() };
}
},
files: {
'docs/_includes/customizer-variables.html': 'docs/_jade/customizer-variables.jade',
'docs/_includes/nav/customize.html': 'docs/_jade/customizer-nav.jade'
}
options: {
pretty: true,
data: getLessVarsData
},
customizerVars: {
src: 'docs/_jade/customizer-variables.jade',
dest: 'docs/_includes/customizer-variables.html'
},
customizerNav: {
src: 'docs/_jade/customizer-nav.jade',
dest: 'docs/_includes/nav/customize.html'
}
},
......@@ -340,7 +351,9 @@ module.exports = function (grunt) {
reset: true,
relaxerror: [
'Bad value X-UA-Compatible for attribute http-equiv on element meta.',
'Element img is missing required attribute src.'
'Element img is missing required attribute src.',
'Attribute autocomplete not allowed on element input at this point.',
'Attribute autocomplete not allowed on element button at this point.'
]
},
files: {
......@@ -350,15 +363,15 @@ module.exports = function (grunt) {
watch: {
src: {
files: '<%= jshint.src.src %>',
tasks: ['jshint:src', 'qunit']
files: '<%= jshint.core.src %>',
tasks: ['jshint:src', 'qunit', 'concat']
},
test: {
files: '<%= jshint.test.src %>',
tasks: ['jshint:test', 'qunit']
},
less: {
files: 'less/*.less',
files: 'less/**/*.less',
tasks: 'less'
}
},
......@@ -412,7 +425,7 @@ module.exports = function (grunt) {
var testSubtasks = [];
// Skip core tests if running a different subset of the test suite
if (runSubset('core')) {
testSubtasks = testSubtasks.concat(['dist-css', 'csslint', 'jshint', 'jscs', 'qunit', 'build-customizer-html']);
testSubtasks = testSubtasks.concat(['dist-css', 'dist-js', 'csslint:dist', 'test-js', 'docs']);
}
// Skip HTML validation if running a different subset of the test suite
if (runSubset('validate-html') &&
......@@ -430,30 +443,26 @@ module.exports = function (grunt) {
testSubtasks.push('saucelabs-qunit');
}
grunt.registerTask('test', testSubtasks);
grunt.registerTask('test-js', ['jshint:core', 'jshint:test', 'jshint:grunt', 'jscs:core', 'jscs:test', 'jscs:grunt', 'qunit']);
// JS distribution task.
grunt.registerTask('dist-js', ['concat', 'uglify']);
grunt.registerTask('dist-js', ['concat', 'uglify:core', 'commonjs']);
// CSS distribution task.
grunt.registerTask('less-compile', ['less:compileCore', 'less:compileTheme']);
grunt.registerTask('dist-css', ['less-compile', 'autoprefixer', 'usebanner', 'csscomb', 'cssmin']);
// Docs distribution task.
grunt.registerTask('dist-docs', 'copy:docs');
grunt.registerTask('dist-css', ['less-compile', 'autoprefixer:core', 'autoprefixer:theme', 'usebanner', 'csscomb:dist', 'cssmin:minifyCore', 'cssmin:minifyTheme']);
// Full distribution task.
grunt.registerTask('dist', ['clean', 'dist-css', 'copy:fonts', 'dist-js', 'dist-docs']);
grunt.registerTask('dist', ['clean:dist', 'dist-css', 'copy:fonts', 'dist-js']);
// Default task.
grunt.registerTask('default', ['test', 'dist', 'build-glyphicons-data', 'build-customizer']);
grunt.registerTask('default', ['clean:dist', 'copy:fonts', 'test']);
// Version numbering task.
// grunt change-version-number --oldver=A.B.C --newver=X.Y.Z
// This can be overzealous, so its changes should always be manually reviewed!
grunt.registerTask('change-version-number', 'sed');
grunt.registerTask('build-glyphicons-data', function () { generateGlyphiconsData.call(this, grunt); });
// task for building customizer
grunt.registerTask('build-customizer', ['build-customizer-html', 'build-raw-files']);
grunt.registerTask('build-customizer-html', 'jade');
......@@ -462,6 +471,19 @@ module.exports = function (grunt) {
generateRawFiles(grunt, banner);
});
grunt.registerTask('commonjs', 'Generate CommonJS entrypoint module in dist dir.', function () {
var srcFiles = grunt.config.get('concat.bootstrap.src');
var destFilepath = 'dist/js/npm.js';
generateCommonJSModule(grunt, srcFiles, destFilepath);
});