Bootswatch has awesome themes which are built on top of Bootstrap. To integrate those themes to your web application, you have a few options. One of them is to build the css file by combining bootstrap.less file with the less files provided by bootswatch. This is the way I chose to go with. However, what I actually wanted was a little bit more complex:
With this way, switching between themes would be just as easy as changing the filename suffix. I achieved this with gulp and you can find the sample in my GitHub account: gulp-bootswatch-sample. To get the sample up and running, run the following commands in order:
// install bower globally if you don't have it already npm install bower -g // install gulp globally if you don't have it already npm install gulp -g // navigate to my sample projects root folder and run the following commands npm install bower install // finally run gulp the tasks gulp
Here is how my gulpfile.js file looks like:
var gulp = require('gulp'), minifycss = require('gulp-minify-css'), concat = require('gulp-concat'), less = require('gulp-less'), gulpif = require('gulp-if'), order = require('gulp-order'), gutil = require('gulp-util'), rename = require('gulp-rename'), foreach = require('gulp-foreach'), debug = require('gulp-debug'), path =require('path'), merge = require('merge-stream'), del = require('del'); gulp.task('default', ['clean'], function() { gulp.start('fonts', 'styles'); }); gulp.task('clean', function(cb) { del(['assets/css', 'assets/js', 'assets/less', 'assets/img', 'assets/fonts'], cb) }); gulp.task('fonts', function() { var fileList = [ 'bower_components/bootstrap/dist/fonts/*', 'bower_components/fontawesome/fonts/*' ]; return gulp.src(fileList) .pipe(gulp.dest('assets/fonts')); }); gulp.task('styles', function() { var baseContent = '@import "bower_components/bootstrap/less/bootstrap.less";@import "bower_components/bootswatch/$theme$/variables.less";@import "bower_components/bootswatch/$theme$/bootswatch.less";@import "bower_components/bootstrap/less/utilities.less";'; var isBootswatchFile = function(file) { var suffix = 'bootswatch.less'; return file.path.indexOf(suffix, file.path.length - suffix.length) !== -1; } var isBootstrapFile = function(file) { var suffix = 'bootstrap-', fileName = path.basename(file.path); return fileName.indexOf(suffix) == 0; } var fileList = [ 'client/less/main.less', 'bower_components/bootswatch/**/bootswatch.less', 'bower_components/fontawesome/css/font-awesome.css' ]; return gulp.src(fileList) .pipe(gulpif(isBootswatchFile, foreach(function(stream, file) { var themeName = path.basename(path.dirname(file.path)), content = replaceAll(baseContent, '$theme$', themeName), file = string_src('bootstrap-' + themeName + '.less', content); return file; }))) .pipe(less()) .pipe(gulp.dest('assets/css')) .pipe(gulpif(isBootstrapFile, foreach(function(stream, file) { var fileName = path.basename(file.path), themeName = fileName.substring(fileName.indexOf('-') + 1, fileName.indexOf('.')); return merge(stream, gulp.src(['assets/css/font-awesome.css', 'assets/css/main.css'])) .pipe(concat('style-' + themeName + ".css")) .pipe(gulp.dest('assets/css')) .pipe(rename({suffix: '.min'})) .pipe(minifycss()) .pipe(gulp.dest('assets/css')); }))) }); function escapeRegExp(string) { return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); } function replaceAll(string, find, replace) { return string.replace(new RegExp(escapeRegExp(find), 'g'), replace); } function string_src(filename, string) { var src = require('stream').Readable({ objectMode: true }) src._read = function () { this.push(new gutil.File({ cwd: "", base: "", path: filename, contents: new Buffer(string) })) this.push(null) } return src }
End result :)
I wished I had something like this when I started doing this so I hope this was helpful to you somehow. Enjoy!