Permalink
Browse files

first commit

  • Loading branch information...
0 parents commit ab26264938d9087354e5b43f73bfe68c41ab6fd3 @pgte committed Aug 13, 2012
Showing with 5,452 additions and 0 deletions.
  1. +4 −0 .gitignore
  2. +34 −0 README.md
  3. +147 −0 bin/build.js
  4. +9 −0 bin/disclaimer.js
  5. +3 −0 bin/extractors/home.js
  6. +13 −0 bin/extractors/sourcecode.js
  7. +38 −0 bin/extractors/toc.js
  8. +31 −0 bin/extractors/trainer.js
  9. +55 −0 bin/markdown.js
  10. +14 −0 bin/package.json
  11. +42 −0 bin/schedule.js
  12. +28 −0 bin/server.js
  13. +1 −0 build/README
  14. +29 −0 classes/example.json
  15. +11 −0 package.json
  16. +14 −0 static/css/disclaimer.css
  17. +124 −0 static/css/gist.css
  18. +201 −0 static/css/github-highlight.css
  19. +2,752 −0 static/css/index.css
  20. BIN static/fonts/Lobster_1.3-webfont.eot
  21. +151 −0 static/fonts/Lobster_1.3-webfont.svg
  22. BIN static/fonts/Lobster_1.3-webfont.ttf
  23. BIN static/fonts/Lobster_1.3-webfont.woff
  24. BIN static/fonts/OpenSans-Bold-webfont.eot
  25. +146 −0 static/fonts/OpenSans-Bold-webfont.svg
  26. BIN static/fonts/OpenSans-Bold-webfont.ttf
  27. BIN static/fonts/OpenSans-Bold-webfont.woff
  28. BIN static/fonts/OpenSans-BoldItalic-webfont.eot
  29. +146 −0 static/fonts/OpenSans-BoldItalic-webfont.svg
  30. BIN static/fonts/OpenSans-BoldItalic-webfont.ttf
  31. BIN static/fonts/OpenSans-BoldItalic-webfont.woff
  32. BIN static/fonts/OpenSans-ExtraBold-webfont.eot
  33. +146 −0 static/fonts/OpenSans-ExtraBold-webfont.svg
  34. BIN static/fonts/OpenSans-ExtraBold-webfont.ttf
  35. BIN static/fonts/OpenSans-ExtraBold-webfont.woff
  36. BIN static/fonts/OpenSans-ExtraBoldItalic-webfont.eot
  37. +146 −0 static/fonts/OpenSans-ExtraBoldItalic-webfont.svg
  38. BIN static/fonts/OpenSans-ExtraBoldItalic-webfont.ttf
  39. BIN static/fonts/OpenSans-ExtraBoldItalic-webfont.woff
  40. BIN static/fonts/OpenSans-Italic-webfont.eot
  41. +146 −0 static/fonts/OpenSans-Italic-webfont.svg
  42. BIN static/fonts/OpenSans-Italic-webfont.ttf
  43. BIN static/fonts/OpenSans-Italic-webfont.woff
  44. BIN static/fonts/OpenSans-Light-webfont.eot
  45. +146 −0 static/fonts/OpenSans-Light-webfont.svg
  46. BIN static/fonts/OpenSans-Light-webfont.ttf
  47. BIN static/fonts/OpenSans-Light-webfont.woff
  48. BIN static/fonts/OpenSans-LightItalic-webfont.eot
  49. +146 −0 static/fonts/OpenSans-LightItalic-webfont.svg
  50. BIN static/fonts/OpenSans-LightItalic-webfont.ttf
  51. BIN static/fonts/OpenSans-LightItalic-webfont.woff
  52. BIN static/fonts/OpenSans-Regular-webfont.eot
  53. +146 −0 static/fonts/OpenSans-Regular-webfont.svg
  54. BIN static/fonts/OpenSans-Regular-webfont.ttf
  55. BIN static/fonts/OpenSans-Regular-webfont.woff
  56. BIN static/fonts/OpenSans-Semibold-webfont.eot
  57. +146 −0 static/fonts/OpenSans-Semibold-webfont.svg
  58. BIN static/fonts/OpenSans-Semibold-webfont.ttf
  59. BIN static/fonts/OpenSans-Semibold-webfont.woff
  60. BIN static/fonts/OpenSans-SemiboldItalic-webfont.eot
  61. +146 −0 static/fonts/OpenSans-SemiboldItalic-webfont.svg
  62. BIN static/fonts/OpenSans-SemiboldItalic-webfont.ttf
  63. BIN static/fonts/OpenSans-SemiboldItalic-webfont.woff
  64. +22 −0 static/html/layout-slide.html
  65. +17 −0 static/html/layout.html
  66. +5 −0 static/html/myfirm.disclaimer.html
  67. +9 −0 static/html/trainer.html
  68. BIN static/img/myfirm/logo.jpg
  69. BIN static/img/trainers/pedroteixeira.jpg
  70. BIN static/img/trainers/pedroteixeira.png
  71. +4 −0 static/js/jquery.min.js
  72. +4 −0 static/js/keymaster.min.js
  73. +230 −0 static/js/prompter.js
4 .gitignore
@@ -0,0 +1,4 @@
+.DS_Store
+build/
+*node_modules*
+units/
34 README.md
@@ -0,0 +1,34 @@
+# Skroll
+
+Framework for class trainings.
+
+## Install
+
+``` sh
+cd bin
+npm install
+cd ..
+```
+
+## Creating a class
+
+Add a json file to `classes` using `classes/example.json` as a reference.
+
+## Creating an unit
+
+Add the unit to the units folder. You must have an index.md and a meta.json file. The `src` folder is where code lives and will be bundled in a tar.gz if you put something there.
+
+## Build
+
+```sh
+node ./bin/build.js -c <class name>
+node ./bin/server.js -c <class name>
+```
+
+In the default example, use `example` as class name.
+
+## Use
+
+Visit http://localhost:8080/
+
+When inside a unit, use the arrow keys to navigate back / forward.
147 bin/build.js
@@ -0,0 +1,147 @@
+#!/usr/bin/env node
+var fs = require('fs')
+ , exec = require('child_process').exec
+ , path = require('path')
+ , mkdirp = require('mkdirp')
+ , Plates = require('plates')
+ , argv = require('optimist')
+ , cheerio = require('cheerio')
+ , async = require('async')
+ , markdown = require('./markdown')
+ , home = require('./extractors/home')
+ , toc = require('./extractors/toc')
+ , sourcecode = require('./extractors/sourcecode')
+ , trainer = require('./extractors/trainer')
+ , schedule = require('./schedule')
+ , disclaimer = require('./disclaimer')
+ ;
+
+argv = argv
+ .usage('Usage: $0 -c [class-name]')
+ .alias('c', 'class')
+ .describe('c', 'class to build')
+ .demand(['c'])
+ .argv
+ ;
+
+function stripTags(str) {
+ return str.replace(/(<([^>]+)>)/ig,"");
+}
+
+var build_dir = path.resolve(__dirname, '..', 'build', argv.c);
+
+var i = 0;
+
+var klass = require('../classes/' + argv.c + '.json');
+
+var units = klass.units;
+
+var layout = fs.readFileSync(__dirname +
+ '/../static/html/layout.html', 'utf8');
+
+var layoutSlides = fs.readFileSync(__dirname +
+ '/../static/html/layout-slide.html', 'utf8');
+
+var globalTOC = [];
+
+var titles = {};
+var unitLinks = {};
+
+async.forEachSeries(units, function (unit, next) {
+ // create class directory
+ i++;
+ var filename = (i<10 ? '0'+i : i) + '-' + unit + '.html';
+ console.log('[html] `' + unit + '`');
+ var unit_dir = path.resolve(__dirname, '..', 'units', unit)
+ , src_dir = path.resolve(unit_dir, 'src')
+ , body = fs.readFileSync(path.resolve(unit_dir, 'index.md'), 'utf-8')
+ ;
+
+ console.log('file name:', filename);
+
+ markdown(body, function(err, markup) {
+ if (err) { return next(err); }
+
+ mkdirp.sync(build_dir);
+ mkdirp.sync(build_dir + '/units');
+
+ // Build pages
+
+ var page = Plates.bind(layoutSlides, {
+ toc: home() + toc(markup) + (sourcecode(unit_dir, unit) || ""),
+ body: markup
+ });
+
+ // correct image references
+ page = page.replace('___image_prefix___', '/units/' + unit + '/');
+
+ var $ = cheerio.load(page);
+
+ // Write unit HTML file to build dir
+ fs.writeFileSync(path.join(build_dir, filename), page);
+
+ // Add title
+ var title = stripTags($('h1').first().html());
+ console.log('title:', title);
+ titles[unit] = title;
+ unitLinks[unit] = '/' + filename;
+ globalTOC.push('<li><a href="/' + filename +'">' + (title || unit) +'</a></li>');
+
+ exec('cp -R ' + unit_dir + ' ' + build_dir + '/units', function(err, stdout, stderr) {
+ if (err) { return next(err); }
+
+ if (path.existsSync(src_dir)) {
+ var cmd = 'cd ' + src_dir + '; tar cvfz ' + build_dir + '/units/' + unit + '/' + unit + '.src.tgz *';
+
+ exec(cmd, function(err, stdout, stderr) {
+ if (err) { return next(err); }
+ next();
+ });
+
+ }
+ });
+
+
+ });
+
+
+}, function(err) {
+ if (err) {
+ throw err;
+ }
+
+ var disclaimerMarkup = '<section id="disclaimer">' + disclaimer(klass) + '</section>';
+
+ var trainers = klass.trainers.map(function(_trainer) {
+ return trainer(_trainer);
+ }).join('');
+
+ var tocPage = Plates.bind(layout, {
+ body: disclaimerMarkup + '<h1>Hosts</h1>' + trainers + '<h1>Contents</h1><ol>' + globalTOC.join('\n') + '</ol>'
+ });
+ fs.writeFileSync(path.join(build_dir, 'index.html'), tocPage);
+
+ // Build schedule
+
+ (function() {
+ var page = Plates.bind(layout, {
+ body: schedule(klass.schedule, titles, unitLinks)
+ });
+ fs.writeFileSync(path.join(build_dir, 'schedule.html'), page);
+ }());
+
+ // Build trainers
+
+ (function() {
+ var trainerPath = path.join(build_dir, 'trainers');
+ mkdirp.sync(trainerPath);
+ klass.trainers.forEach(function(_trainer) {
+ var page = Plates.bind(layout, {
+ body: trainer(_trainer)
+ });
+ fs.writeFileSync(path.join(trainerPath, _trainer.twitter + '.html'), page);
+ });
+ }());
+
+
+});
9 bin/disclaimer.js
@@ -0,0 +1,9 @@
+var fs = require('fs');
+
+module.exports = function(klass) {
+ var branding = klass.branding;
+
+ if (! branding) { throw new Error('class does not have .branding'); }
+
+ return fs.readFileSync(__dirname + '/../static/html/' + branding + '.disclaimer.html', 'utf8');
+}
3 bin/extractors/home.js
@@ -0,0 +1,3 @@
+module.exports = function() {
+ return '<a href="/index.html">&larr; Home</a>'
+}
13 bin/extractors/sourcecode.js
@@ -0,0 +1,13 @@
+var fs = require('fs')
+ , path = require('path')
+ ;
+
+module.exports = function(unitPath, unit) {
+ try {
+ fs.statSync(path.join(unitPath, 'src'));
+ return '<a href="/units/' + unit + '/' + unit + '.src.tgz">Download source code</a>';
+ } catch(err) {
+
+ }
+
+}
38 bin/extractors/toc.js
@@ -0,0 +1,38 @@
+var cheerio = require('cheerio')
+;
+
+function stripTags(str) {
+ return str.replace(/(<([^>]+)>)/ig,"");
+}
+
+module.exports = function(html) {
+ var $ = cheerio.load(html);
+
+ var toc = [];
+ var index = 0;
+
+ $('*').each(function(idx, tag) {
+ tag.children.forEach(function(tag) {
+ index += 1;
+ if (tag.name === 'h2') {
+ tag = $(tag);
+ tag.attr('id', index);
+ toc.push('<a href="#p' + index +'">' + stripTags(tag.html()) + '</a>');
+ }
+ });
+ });
+
+ var html = '';
+
+ html += ' [ <a href="/schedule.html">Schedule</a> ]<p></p>';
+
+ html += '<ol>';
+ toc.forEach(function(entry) {
+ html += '<li>';
+ html += entry;
+ html += '</li>';
+ });
+ html += '</ol>';
+
+ return html;
+}
31 bin/extractors/trainer.js
@@ -0,0 +1,31 @@
+var Plates = require('plates')
+ , fs = require('fs')
+ ;
+
+module.exports = function(trainer) {
+ var template = fs.readFileSync(__dirname + '/../../static/html/trainer.html', 'utf8');
+
+ var map = new Plates.Map();
+ map.class('name').use('name');
+ map.class('bio').use('bio');
+ map.class('twitter').use('twitter');
+ map.class('twitter').use('twitter_url').as('href');
+ map.class('github').use('github');
+ map.class('github').use('github_url').as('href');
+ map.class('blog').use('blog');
+ map.class('blog').use('blog').as('href');
+ map.class('mugshot').use('mugshot').as('src');
+
+ var data = {
+ name: trainer.name,
+ bio: trainer.bio,
+ twitter_url: 'https://twitter.com/' + trainer.twitter,
+ twitter: "@" + trainer.twitter,
+ github_url: 'https://github.com/' + trainer.github,
+ github: trainer.github,
+ blog: trainer.blog,
+ mugshot: '/img/trainers/' + trainer.mugshot
+ };
+
+ return Plates.bind(template, data, map);
+}
55 bin/markdown.js
@@ -0,0 +1,55 @@
+var request = require('request');
+
+var GITHUB_BASE_URL = 'https://api.github.com';
+
+function githubRepoActionURL(pathComponents) {
+ var url = GITHUB_BASE_URL + '/';
+ url += pathComponents.map(function(pathComponent) {
+ return escape(pathComponent);
+ }).join('/');
+
+ return url;
+}
+
+
+function handleResponse(expectedStatusCode, dontParse, callback) {
+ if ('function' === typeof dontParse) {
+ callback = dontParse;
+ dontParse = false;
+ }
+ return function(err, resp, body) {
+ if (err) {
+ console.error(err);
+ return callback(err);
+ }
+ if (resp.statusCode !== expectedStatusCode) {
+ try { body = JSON.parse(body); }
+ catch(error) { }
+ err = new Error('Github expected response status code is ' + resp.statusCode + 'URL: ' + resp.request.href + ', body:' + (body && (body.message || body) || ''));
+ return callback(err);
+ }
+ if (typeof body === 'string' && ! dontParse) {
+ try { body = JSON.parse(body); }
+ catch(error) { err = error; }
+ }
+ return callback(err, body);
+ };
+}
+
+//
+// Convert Markdown to HTML Markup
+//
+function markdownToMarkup(markdown, callback) {
+ var url = githubRepoActionURL(['markdown']) + '?mode=gfm';
+ request.post({
+ url: url,
+ json: {
+ text: markdown
+ }
+ }, handleResponse(200, true, function(err, markup) {
+ if (err) { return callback(err); }
+ callback(null, markup);
+ }));
+}
+
+module.exports = markdownToMarkup;
14 bin/package.json
@@ -0,0 +1,14 @@
+{ "private" : true
+, "name" : "skroll-build-scripts"
+, "version" : "0.0.1"
+, "dependencies" :
+ { "optimist" : "0.3.x"
+ , "plates": "0.4.x"
+ , "cheerio": "0.7.x"
+ , "node-static": "0.5.x"
+ , "mkdirp": "0.3.x"
+ , "request": "2.10.x"
+ , "async": "0.1.x"
+ }
+}
+
42 bin/schedule.js
@@ -0,0 +1,42 @@
+module.exports = function(schedule, titles, unitLinks) {
+ var html = '';
+ var day = 0;
+ var lastHour;
+
+ html += '<h1>Schedule</h1><table class="schedule"><thead><tr>';
+ html += '<th>start</th>';
+ html += '<th>end</th>';
+ html += '<th></th>';
+ html += '</tr></thead>';
+
+ html += '<tbody>';
+
+ schedule.forEach(function(entry) {
+
+ if (! entry.start || ! entry.end) { throw new Error('Entry needs start and end'); }
+
+ var hour = parseInt(entry.start.substring(0, 2), 10);
+
+ if ((! lastHour) || hour < lastHour) {
+ day ++;
+ html += '<tr class="daybreak"><td colspan="3">Day ' + day + '</td></tr>';
+ }
+ lastHour = hour;
+
+ var title = titles[entry.unit] || entry.unit || (entry['break'] ? 'Break' : '-');
+
+ var link = unitLinks[entry.unit];
+ if (link) {
+ title = '<a href="' + link + '">' + title + '</a>';
+ }
+
+ html += '<tr>';
+ html += '<td>' + entry.start + '</td>';
+ html += '<td>' + entry.end + '</td>';
+ html += '<td>' + title + '</td>';
+ html += '</tr>';
+ });
+
+ html += '</tbody></table>';
+ return html;
+}
28 bin/server.js
@@ -0,0 +1,28 @@
+#!/usr/bin/env node
+
+var argv = require('optimist')
+ , cheerio = require('cheerio')
+ ;
+
+argv = argv
+ .usage('Usage: $0 -c [class-name] -p [port]')
+ .alias('c', 'class')
+ .describe('c', 'class to start')
+ .demand('c')
+ .alias('p', 'port')
+ .argv
+ ;
+
+var static = require('node-static'),
+ file = new static.Server(__dirname + '/../build/' + argv.c),
+ globalFile = new static.Server(__dirname + '/../static');
+
+require('http').createServer(function(req, res) {
+ globalFile.serve(req, res, function(e) {
+ if (e && e.status === 404) {
+ file.serve(req, res);
+ }
+ });
+}).listen(argv.p && parseInt(argv.p, 10)|| 8080, function() {
+ console.log('Listening');
+});
1 build/README
@@ -0,0 +1 @@
+HEY
29 classes/example.json
@@ -0,0 +1,29 @@
+{ "name" : "Example Class"
+, "version" : "0.0.1"
+, "private" : true
+, "branding" : "myfirm"
+, "units" :
+ [ "intro", "unit1", "unit2"]
+, "schedule":
+ [{ "unit" : "intro", "start": "09:00", "end": "09:15", "day": 1 }
+ ,{ "unit" : "unit1", "start": "09:15", "end": "10:30", "day": 1 }
+ ,{ "unit" : "unit2", "start": "10:30", "end": "11:00", "day": 1 }
+ ,{ "break": "coffee", "start": "11:00", "end": "11:15", "day": 1 }
+ ,{ "unit" : "Unit 3", "start": "11:15", "end": "11:45", "day": 1 }
+ ,{ "unit" : "Unit 4", "start": "11:45", "end": "12:30", "day": 1 }
+ ,{ "break": "lunch", "start": "12:30", "end": "13:30", "day": 1 }
+ ,{ "unit" : "Unit 5", "start": "13:30", "end": "14:30", "day": 1 }
+ ,{ "unit" : "Unit 6", "start": "09:00", "end": "10:00", "day": 2 }
+ ,{ "unit" : "Unit 7", "start": "10:00", "end": "10:30", "day": 2 }
+ ]
+, "trainers": [
+ {
+ "name": "Pedro Teixeira"
+ , "mugshot": "pedroteixeira.jpg"
+ , "bio": "Geek, programmer, freelancer, and entrepreneur. Author of many Node.js modules, the Node Tuts screencast, and the Hands-on Node.js e-book and overall fervent proclaimer of the Node.js creed. Writing a book for Wiley on Node.js. Software Engineer @ Nodejitsu"
+ , "twitter": "pgte"
+ , "github": "pgte"
+ , "blog": "http://metaduck.com"
+ }
+ ]
+}
11 package.json
@@ -0,0 +1,11 @@
+{
+ "name": "skroll",
+ "version": "0.1.0",
+ "private": false,
+ "scripts": {
+ "start": "node ./bin/server.js"
+ },
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+}
14 static/css/disclaimer.css
@@ -0,0 +1,14 @@
+#disclaimer h1 {
+ margin-top: 0;
+}
+
+#disclaimer img {
+ padding: 20px;
+}
+
+#disclaimer p {
+ font-size: 12px;
+ line-height: 24px;
+ margin: 0;
+ text-align: center;
+}
124 static/css/gist.css
@@ -0,0 +1,124 @@
+/* copyright github */
+.gist {
+ color: #000;
+}
+
+ .gist div {
+ padding: 0;
+ margin: 0;
+ }
+
+ .gist .gist-file {
+ border: 1px solid #dedede; /* gray */
+ font-family: Monaco, "Courier New", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", monospace;
+ margin-bottom: 1em;
+ }
+
+ .gist .gist-file .gist-meta {
+ overflow: hidden;
+ font-size: 85%;
+ padding: .5em;
+ color: #666;
+ background-color: #eaeaea;
+ }
+
+ .gist .gist-file .gist-meta a {
+ color: #369;
+ }
+
+ .gist .gist-file .gist-meta a:visited {
+ color: #737;
+ }
+
+ .gist .gist-file .gist-data {
+ overflow: auto;
+ word-wrap: normal;
+ background-color: #f8f8ff;
+ border-bottom: 1px solid #ddd;
+ font-size: 100%;
+ }
+
+ .gist .gist-file .gist-data pre {
+ font-family: 'Bitstream Vera Sans Mono', 'Courier', monospace;
+ background: transparent !important;
+ margin: 0 !important;
+ border: none !important;
+ padding: .25em .5em .5em .5em !important;
+ }
+
+ .gist .gist-file .gist-data .gist-highlight {
+ background: transparent !important;
+ }
+
+ .gist .gist-file .gist-data .gist-line-numbers {
+ background-color: #ececec;
+ color: #aaa;
+ border-right: 1px solid #ddd;
+ text-align: right;
+ }
+
+ .gist .gist-file .gist-data .gist-line-numbers span {
+ clear: right;
+ display: block;
+ }
+
+.gist-syntax { background: #ffffff; }
+.gist-syntax .c { color: #999988; font-style: italic } /* Comment */
+.gist-syntax .err { color: #a61717; background-color: #e3d2d2 } /* Error */
+.gist-syntax .k { color: #000000; font-weight: bold } /* Keyword */
+.gist-syntax .o { color: #000000; font-weight: bold } /* Operator */
+.gist-syntax .cm { color: #999988; font-style: italic } /* Comment.Multiline */
+.gist-syntax .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
+.gist-syntax .c1 { color: #999988; font-style: italic } /* Comment.Single */
+.gist-syntax .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
+.gist-syntax .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
+.gist-syntax .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
+.gist-syntax .ge { color: #000000; font-style: italic } /* Generic.Emph */
+.gist-syntax .gr { color: #aa0000 } /* Generic.Error */
+.gist-syntax .gh { color: #999999 } /* Generic.Heading */
+.gist-syntax .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
+.gist-syntax .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
+.gist-syntax .go { color: #888888 } /* Generic.Output */
+.gist-syntax .gp { color: #555555 } /* Generic.Prompt */
+.gist-syntax .gs { font-weight: bold } /* Generic.Strong */
+.gist-syntax .gu { color: #aaaaaa } /* Generic.Subheading */
+.gist-syntax .gt { color: #aa0000 } /* Generic.Traceback */
+.gist-syntax .kc { color: #000000; font-weight: bold } /* Keyword.Constant */
+.gist-syntax .kd { color: #000000; font-weight: bold } /* Keyword.Declaration */
+.gist-syntax .kp { color: #000000; font-weight: bold } /* Keyword.Pseudo */
+.gist-syntax .kr { color: #000000; font-weight: bold } /* Keyword.Reserved */
+.gist-syntax .kt { color: #445588; font-weight: bold } /* Keyword.Type */
+.gist-syntax .m { color: #009999 } /* Literal.Number */
+.gist-syntax .s { color: #d14 } /* Literal.String */
+.gist-syntax .na { color: #008080 } /* Name.Attribute */
+.gist-syntax .nb { color: #0086B3 } /* Name.Builtin */
+.gist-syntax .nc { color: #445588; font-weight: bold } /* Name.Class */
+.gist-syntax .no { color: #008080 } /* Name.Constant */
+.gist-syntax .ni { color: #800080 } /* Name.Entity */
+.gist-syntax .ne { color: #990000; font-weight: bold } /* Name.Exception */
+.gist-syntax .nf { color: #990000; font-weight: bold } /* Name.Function */
+.gist-syntax .nn { color: #555555 } /* Name.Namespace */
+.gist-syntax .nt { color: #000080 } /* Name.Tag */
+.gist-syntax .nv { color: #008080 } /* Name.Variable */
+.gist-syntax .ow { color: #000000; font-weight: bold } /* Operator.Word */
+.gist-syntax .w { color: #bbbbbb } /* Text.Whitespace */
+.gist-syntax .mf { color: #009999 } /* Literal.Number.Float */
+.gist-syntax .mh { color: #009999 } /* Literal.Number.Hex */
+.gist-syntax .mi { color: #009999 } /* Literal.Number.Integer */
+.gist-syntax .mo { color: #009999 } /* Literal.Number.Oct */
+.gist-syntax .sb { color: #d14 } /* Literal.String.Backtick */
+.gist-syntax .sc { color: #d14 } /* Literal.String.Char */
+.gist-syntax .sd { color: #d14 } /* Literal.String.Doc */
+.gist-syntax .s2 { color: #d14 } /* Literal.String.Double */
+.gist-syntax .se { color: #d14 } /* Literal.String.Escape */
+.gist-syntax .sh { color: #d14 } /* Literal.String.Heredoc */
+.gist-syntax .si { color: #d14 } /* Literal.String.Interpol */
+.gist-syntax .sx { color: #d14 } /* Literal.String.Other */
+.gist-syntax .sr { color: #009926 } /* Literal.String.Regex */
+.gist-syntax .s1 { color: #d14 } /* Literal.String.Single */
+.gist-syntax .ss { color: #990073 } /* Literal.String.Symbol */
+.gist-syntax .bp { color: #999999 } /* Name.Builtin.Pseudo */
+.gist-syntax .vc { color: #008080 } /* Name.Variable.Class */
+.gist-syntax .vg { color: #008080 } /* Name.Variable.Global */
+.gist-syntax .vi { color: #008080 } /* Name.Variable.Instance */
+.gist-syntax .il { color: #009999 } /* Literal.Number.Integer.Long */
201 static/css/github-highlight.css
@@ -0,0 +1,201 @@
+/*
+
+github.com style (c) Vasily Polovnyov <vast@whiteants.net>
+
+*/
+
+code, pre {
+ background-color: #f5f5f5;
+ display: block;
+ padding: 8.5px;
+ margin: 0 0 18px;
+ line-height: 18px;
+ font-size: 12px;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ white-space: pre;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
+pre .comment,
+pre .template_comment,
+pre .diff .header,
+pre .javadoc {
+ color: #998;
+ font-style: italic
+}
+
+pre .keyword,
+pre .css .rule .keyword,
+pre .winutils,
+pre .javascript .title,
+pre .lisp .title,
+pre .subst {
+ color: #000;
+ font-weight: bold
+}
+
+pre .number,
+pre .hexcolor {
+ color: #40a070
+}
+
+pre .string,
+pre .tag .value,
+pre .phpdoc,
+pre .tex .formula {
+ color: #d14
+}
+
+pre .title,
+pre .id {
+ color: #900;
+ font-weight: bold
+}
+
+pre .javascript .title,
+pre .lisp .title,
+pre .subst {
+ font-weight: normal
+}
+
+pre .class .title,
+pre .haskell .label,
+pre .tex .command {
+ color: #458;
+ font-weight: bold
+}
+
+pre .tag,
+pre .tag .title,
+pre .rules .property,
+pre .django .tag .keyword {
+ color: #000080;
+ font-weight: normal
+}
+
+pre .attribute,
+pre .variable,
+pre .instancevar,
+pre .lisp .body {
+ color: #008080
+}
+
+pre .regexp {
+ color: #009926
+}
+
+pre .class {
+ color: #458;
+ font-weight: bold
+}
+
+pre .symbol,
+pre .ruby .symbol .string,
+pre .ruby .symbol .keyword,
+pre .ruby .symbol .keymethods,
+pre .lisp .keyword,
+pre .tex .special,
+pre .input_number {
+ color: #990073
+}
+
+pre .builtin,
+pre .built_in,
+pre .lisp .title {
+ color: #0086b3
+}
+
+pre .preprocessor,
+pre .pi,
+pre .doctype,
+pre .shebang,
+pre .cdata {
+ color: #999;
+ font-weight: bold
+}
+
+pre .deletion {
+ background: #fdd
+}
+
+pre .addition {
+ background: #dfd
+}
+
+pre .diff .change {
+ background: #0086b3
+}
+
+pre .chunk {
+ color: #aaa
+}
+
+pre .tex .formula {
+ opacity: 0.5;
+}
+
+.hll { background-color: #ffffcc }
+.c { color: #888888 } /* Comment */
+.err { color: #a61717; background-color: #e3d2d2 } /* Error */
+.k { color: #008800; font-weight: bold } /* Keyword */
+.cm { color: #888888 } /* Comment.Multiline */
+.cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
+.c1 { color: #888888 } /* Comment.Single */
+.cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
+.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
+.ge { font-style: italic } /* Generic.Emph */
+.gr { color: #aa0000 } /* Generic.Error */
+.gh { color: #303030 } /* Generic.Heading */
+.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
+.go { color: #888888 } /* Generic.Output */
+.gp { color: #555555 } /* Generic.Prompt */
+.gs { font-weight: bold } /* Generic.Strong */
+.gu { color: #606060 } /* Generic.Subheading */
+.gt { color: #aa0000 } /* Generic.Traceback */
+.kc { color: #008800; font-weight: bold } /* Keyword.Constant */
+.kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
+.kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
+.kp { color: #008800 } /* Keyword.Pseudo */
+.kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
+.kt { color: #888888; font-weight: bold } /* Keyword.Type */
+.m { color: #0000DD; font-weight: bold } /* Literal.Number */
+.s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
+.na { color: #336699 } /* Name.Attribute */
+.nb { color: #003388 } /* Name.Builtin */
+.nc { color: #bb0066; font-weight: bold } /* Name.Class */
+.no { color: #003366; font-weight: bold } /* Name.Constant */
+.nd { color: #555555 } /* Name.Decorator */
+.ne { color: #bb0066; font-weight: bold } /* Name.Exception */
+.nf { color: #0066bb; font-weight: bold } /* Name.Function */
+.nl { color: #336699; font-style: italic } /* Name.Label */
+.nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
+.py { color: #336699; font-weight: bold } /* Name.Property */
+.nt { color: #bb0066; font-weight: bold } /* Name.Tag */
+.nv { color: #336699 } /* Name.Variable */
+.ow { color: #008800 } /* Operator.Word */
+.w { color: #bbbbbb } /* Text.Whitespace */
+.mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
+.mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
+.mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
+.mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
+.sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
+.sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
+.sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
+.s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
+.se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
+.sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
+.si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
+.sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
+.sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
+.s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
+.ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
+.bp { color: #003388 } /* Name.Builtin.Pseudo */
+.vc { color: #336699 } /* Name.Variable.Class */
+.vg { color: #dd7700 } /* Name.Variable.Global */
+.vi { color: #3333bb } /* Name.Variable.Instance */
+.il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
2,752 static/css/index.css
@@ -0,0 +1,2752 @@
+
+@font-face {
+ font-family: 'Lobster';
+ src: url('../fonts/Lobster_1.3-webfont.eot');
+ src: url('../fonts/Lobster_1.3-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/Lobster_1.3-webfont.woff') format('woff'),
+ url('../fonts/Lobster_1.3-webfont.ttf') format('truetype'),
+ url('../fonts/Lobster_1.3-webfont.svg#Lobster13Regular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'OpenSansLight';
+ src: url('../fonts/OpenSans-Light-webfont.eot');
+ src: url('../fonts/OpenSans-Light-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/OpenSans-Light-webfont.woff') format('woff'),
+ url('../fonts/OpenSans-Light-webfont.ttf') format('truetype'),
+ url('../fonts/OpenSans-Light-webfont.svg#OpenSansLight') format('svg');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+@font-face {
+ font-family: 'OpenSansLightItalic';
+ src: url('../fonts/OpenSans-LightItalic-webfont.eot');
+ src: url('../fonts/OpenSans-LightItalic-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/OpenSans-LightItalic-webfont.woff') format('woff'),
+ url('../fonts/OpenSans-LightItalic-webfont.ttf') format('truetype'),
+ url('../fonts/OpenSans-LightItalic-webfont.svg#OpenSansLightItalic') format('svg');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+@font-face {
+ font-family: 'OpenSansRegular';
+ src: url('../fonts/OpenSans-Regular-webfont.eot');
+ src: url('../fonts/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/OpenSans-Regular-webfont.woff') format('woff'),
+ url('../fonts/OpenSans-Regular-webfont.ttf') format('truetype'),
+ url('../fonts/OpenSans-Regular-webfont.svg#OpenSansRegular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+@font-face {
+ font-family: 'OpenSansItalic';
+ src: url('../fonts/OpenSans-Italic-webfont.eot');
+ src: url('../fonts/OpenSans-Italic-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/OpenSans-Italic-webfont.woff') format('woff'),
+ url('../fonts/OpenSans-Italic-webfont.ttf') format('truetype'),
+ url('../fonts/OpenSans-Italic-webfont.svg#OpenSansItalic') format('svg');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+@font-face {
+ font-family: 'OpenSansSemibold';
+ src: url('../fonts/OpenSans-Semibold-webfont.eot');
+ src: url('../fonts/OpenSans-Semibold-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/OpenSans-Semibold-webfont.woff') format('woff'),
+ url('../fonts/OpenSans-Semibold-webfont.ttf') format('truetype'),
+ url('../fonts/OpenSans-Semibold-webfont.svg#OpenSansSemibold') format('svg');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+@font-face {
+ font-family: 'OpenSansSemiboldItalic';
+ src: url('../fonts/OpenSans-SemiboldItalic-webfont.eot');
+ src: url('../fonts/OpenSans-SemiboldItalic-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/OpenSans-SemiboldItalic-webfont.woff') format('woff'),
+ url('../fonts/OpenSans-SemiboldItalic-webfont.ttf') format('truetype'),
+ url('../fonts/OpenSans-SemiboldItalic-webfont.svg#OpenSansSemiboldItalic') format('svg');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+@font-face {
+ font-family: 'OpenSansBold';
+ src: url('../fonts/OpenSans-Bold-webfont.eot');
+ src: url('../fonts/OpenSans-Bold-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/OpenSans-Bold-webfont.woff') format('woff'),
+ url('../fonts/OpenSans-Bold-webfont.ttf') format('truetype'),
+ url('../fonts/OpenSans-Bold-webfont.svg#OpenSansBold') format('svg');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+@font-face {
+ font-family: 'OpenSansBoldItalic';
+ src: url('../fonts/OpenSans-BoldItalic-webfont.eot');
+ src: url('../fonts/OpenSans-BoldItalic-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/OpenSans-BoldItalic-webfont.woff') format('woff'),
+ url('../fonts/OpenSans-BoldItalic-webfont.ttf') format('truetype'),
+ url('../fonts/OpenSans-BoldItalic-webfont.svg#OpenSansBoldItalic') format('svg');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+@font-face {
+ font-family: 'OpenSansExtrabold';
+ src: url('../fonts/OpenSans-ExtraBold-webfont.eot');
+ src: url('../fonts/OpenSans-ExtraBold-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/OpenSans-ExtraBold-webfont.woff') format('woff'),
+ url('../fonts/OpenSans-ExtraBold-webfont.ttf') format('truetype'),
+ url('../fonts/OpenSans-ExtraBold-webfont.svg#OpenSansExtrabold') format('svg');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+@font-face {
+ font-family: 'OpenSansExtraboldItalic';
+ src: url('../fonts/OpenSans-ExtraBoldItalic-webfont.eot');
+ src: url('../fonts/OpenSans-ExtraBoldItalic-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/OpenSans-ExtraBoldItalic-webfont.woff') format('woff'),
+ url('../fonts/OpenSans-ExtraBoldItalic-webfont.ttf') format('truetype'),
+ url('../fonts/OpenSans-ExtraBoldItalic-webfont.svg#OpenSansExtraboldItalic') format('svg');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+/* ............................................................................................................. Bootstrap */
+
+html, body {
+ margin: 0;
+ padding: 0;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+a,
+abbr,
+acronym,
+address,
+cite,
+code,
+del,
+dfn,
+em,
+img,
+q,
+s,
+samp,
+small,
+strike,
+strong,
+sub,
+sup,
+tt,
+var,
+dd,
+dl,
+dt,
+li,
+ol,
+ul,
+fieldset,
+form,
+label,
+legend,
+button,
+table,
+caption,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-weight: normal;
+ font-style: normal;
+ font-size: 100%;
+ line-height: 1;
+ font-family: inherit;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+ol, ul {
+ list-style: none;
+}
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+ content: "";
+}
+html {
+ overflow-y: scroll;
+ font-size: 100%;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+a:focus {
+ outline: none;
+}
+a:hover, a:active {
+ outline: 0;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+ display: block;
+}
+audio, canvas, video {
+ display: inline-block;
+ *display: inline;
+ *zoom: 1;
+}
+audio:not([controls]) {
+ display: none;
+}
+sub, sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+sup {
+ top: -0.5em;
+}
+sub {
+ bottom: -0.25em;
+}
+img {
+ border: 0;
+ -ms-interpolation-mode: bicubic;
+}
+button,
+input,
+select,
+textarea {
+ font-size: 100%;
+ margin: 0;
+ vertical-align: baseline;
+ *vertical-align: middle;
+}
+button, input {
+ line-height: normal;
+ *overflow: visible;
+}
+button::-moz-focus-inner, input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ cursor: pointer;
+ -webkit-appearance: button;
+}
+input[type="search"] {
+ -webkit-appearance: textfield;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+textarea {
+ overflow: auto;
+ vertical-align: top;
+}
+/* Variables.less
+ * Variables to customize the look and feel of Bootstrap
+ * ----------------------------------------------------- */
+/* Mixins.less
+ * Snippets of reusable CSS to develop faster and keep code readable
+ * ----------------------------------------------------------------- */
+/*
+ * Scaffolding
+ * Basic and global styles for generating a grid system, structural layout, and page templates
+ * ------------------------------------------------------------------------------------------- */
+body {
+ background-color: #ffffff;
+ margin: 0;
+ font-family: OpenSansLight, "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ font-weight: normal;
+ line-height: 18px;
+ color: #404040;
+}
+.container {
+ width: 940px;
+ margin-left: auto;
+ margin-right: auto;
+ zoom: 1;
+}
+.container:before, .container:after {
+ display: table;
+ content: "";
+ zoom: 1;
+}
+.container:after {
+ clear: both;
+}
+.container-fluid {
+ position: relative;
+ min-width: 940px;
+ padding-left: 20px;
+ padding-right: 20px;
+ zoom: 1;
+}
+.container-fluid:before, .container-fluid:after {
+ display: table;
+ content: "";
+ zoom: 1;
+}
+.container-fluid:after {
+ clear: both;
+}
+.container-fluid > .sidebar {
+ position: absolute;
+ top: 0;
+ left: 20px;
+ width: 220px;
+}
+.container-fluid > .content {
+ margin-left: 240px;
+}
+a {
+ color: #659134;
+ text-decoration: none;
+ line-height: inherit;
+ font-weight: inherit;
+ cursor: pointer;
+ font-weight: bold;
+}
+a:hover {
+ color: #659134;
+ text-decoration: underline;
+}
+.pull-right {
+ float: right;
+}
+.pull-left {
+ float: left;
+}
+.hide {
+ display: none;
+}
+.show {
+ display: block;
+}
+.row {
+ zoom: 1;
+ margin-left: -20px;
+}
+.row:before, .row:after {
+ display: table;
+ content: "";
+ zoom: 1;
+}
+.row:after {
+ clear: both;
+}
+.row > [class*="span"] {
+ display: inline;
+ float: left;
+ margin-left: 20px;
+}
+.span1 {
+ width: 40px;
+}
+.span2 {
+ width: 100px;
+}
+.span3 {
+ width: 160px;
+}
+.span4 {
+ width: 220px;
+}
+.span5 {
+ width: 280px;
+}
+.span6 {
+ width: 340px;
+}
+.span7 {
+ width: 400px;
+}
+.span8 {
+ width: 460px;
+}
+.span9 {
+ width: 520px;
+}
+.span10 {
+ width: 580px;
+}
+.span11 {
+ width: 640px;
+}
+.span12 {
+ width: 700px;
+}
+.span13 {
+ width: 760px;
+}
+.span14 {
+ width: 820px;
+}
+.span15 {
+ width: 880px;
+}
+.span16 {
+ width: 940px;
+}
+.span17 {
+ width: 1000px;
+}
+.span18 {
+ width: 1060px;
+}
+.span19 {
+ width: 1120px;
+}
+.span20 {
+ width: 1180px;
+}
+.span21 {
+ width: 1240px;
+}
+.span22 {
+ width: 1300px;
+}
+.span23 {
+ width: 1360px;
+}
+.span24 {
+ width: 1420px;
+}
+.row > .offset1 {
+ margin-left: 80px;
+}
+.row > .offset2 {
+ margin-left: 140px;
+}
+.row > .offset3 {
+ margin-left: 200px;
+}
+.row > .offset4 {
+ margin-left: 260px;
+}
+.row > .offset5 {
+ margin-left: 320px;
+}
+.row > .offset6 {
+ margin-left: 380px;
+}
+.row > .offset7 {
+ margin-left: 440px;
+}
+.row > .offset8 {
+ margin-left: 500px;
+}
+.row > .offset9 {
+ margin-left: 560px;
+}
+.row > .offset10 {
+ margin-left: 620px;
+}
+.row > .offset11 {
+ margin-left: 680px;
+}
+.row > .offset12 {
+ margin-left: 740px;
+}
+.span-one-third {
+ width: 300px;
+}
+.span-two-thirds {
+ width: 620px;
+}
+.row > .offset-one-third {
+ margin-left: 340px;
+}
+.row > .offset-two-thirds {
+ margin-left: 660px;
+}
+/* Typography.less
+ * Headings, body text, lists, code, and more for a versatile and durable typography system
+ * ---------------------------------------------------------------------------------------- */
+p {
+ font-size: 20px;
+ font-weight: normal;
+ line-height: 25px;
+ margin-bottom: 12px;
+}
+p small {
+ font-size: 11px;
+ color: #bfbfbf;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-family: Lobster, "Helvetica Neue", Helvetica, Arial;
+ margin-top: 1em;
+ margin-bottom: 0.5em;
+ font-weight: bold;
+ color: #404040;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+ color: #bfbfbf;
+}
+h1 {
+ font-size: 100px;
+ line-height: 150px;
+}
+h1 small {
+ font-size: 18px;
+}
+h2 {
+ font-size: 70px;
+ line-height: 105px;
+}
+h2 small {
+ font-size: 14px;
+}
+h3,
+h4,
+h5,
+h6 {
+ line-height: 36px;
+}
+h3 {
+ font-size: 50px;
+ line-height: 75px;
+}
+h3 small {
+ font-size: 14px;
+}
+h4 {
+ font-size: 20px;
+}
+h4 small {
+ font-size: 12px;
+}
+h5 {
+ font-size: 14px;
+}
+h6 {
+ font-size: 13px;
+ color: #bfbfbf;
+ text-transform: uppercase;
+}
+ul, ol {
+ margin: 0 0 18px 25px;
+}
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+ margin-bottom: 0;
+}
+ul {
+ list-style: disc;
+}
+ol {
+ list-style: decimal;
+}
+li {
+ line-height: 18px;
+}
+ul.unstyled {
+ list-style: none;
+ margin-left: 0;
+}
+dl {
+ margin-bottom: 18px;
+}
+dl dt, dl dd {
+ line-height: 18px;
+}
+dl dt {
+ font-weight: bold;
+}
+dl dd {
+ margin-left: 9px;
+}
+hr {
+ margin: 20px 0 19px;
+ border: 0;
+ border-bottom: 1px solid #eee;
+}
+strong {
+ font-style: inherit;
+ font-weight: bold;
+}
+em {
+ font-style: italic;
+ font-weight: inherit;
+ line-height: inherit;
+}
+.muted {
+ color: #bfbfbf;
+}
+blockquote {
+ margin-bottom: 18px;
+ border-left: 5px solid #eee;
+ padding-left: 15px;
+}
+blockquote p {
+ font-size: 18px;
+ font-weight: 300;
+ line-height: 18px;
+ margin-bottom: 0;
+}
+blockquote small {
+ display: block;
+ font-size: 12px;
+ font-weight: 300;
+ line-height: 18px;
+ color: #bfbfbf;
+}
+blockquote small:before {
+ content: '\2014 \00A0';
+}
+address {
+ display: block;
+ line-height: 18px;
+ margin-bottom: 18px;
+}
+code, pre {
+ padding: 0 3px 2px;
+ font-family: Monaco, Andale Mono, Courier New, monospace;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+code, pre {
+ color: rgba(0, 0, 0, 0.75);
+ padding: 1em;
+ line-height: 1.75em
+}
+
+/* Forms.less
+ * Base styles for various input types, form layouts, and states
+ * ------------------------------------------------------------- */
+form {
+ margin-bottom: 18px;
+}
+fieldset {
+ margin-bottom: 18px;
+ padding-top: 18px;
+}
+fieldset legend {
+ display: block;
+ padding-left: 150px;
+ font-size: 19.5px;
+ line-height: 1;
+ color: #404040;
+ *padding: 0 0 5px 145px;
+ /* IE6-7 */
+
+ *line-height: 1.5;
+ /* IE6-7 */
+
+}
+form .clearfix {
+ margin-bottom: 18px;
+ zoom: 1;
+}
+form .clearfix:before, form .clearfix:after {
+ display: table;
+ content: "";
+ zoom: 1;
+}
+form .clearfix:after {
+ clear: both;
+}
+label,
+input,
+select,
+textarea {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ font-weight: normal;
+ line-height: normal;
+}
+label {
+ padding-top: 6px;
+ font-size: 13px;
+ line-height: 18px;
+ float: left;
+ width: 130px;
+ text-align: right;
+ color: #404040;
+}
+form .input {
+ margin-left: 150px;
+}
+input[type=checkbox], input[type=radio] {
+ cursor: pointer;
+}
+input,
+textarea,
+select,
+.uneditable-input {
+ display: inline-block;
+ width: 210px;
+ height: 18px;
+ padding: 4px;
+ font-size: 13px;
+ line-height: 18px;
+ color: #808080;
+ border: 1px solid #ccc;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+select {
+ padding: initial;
+}
+input[type=checkbox], input[type=radio] {
+ width: auto;
+ height: auto;
+ padding: 0;
+ margin: 3px 0;
+ *margin-top: 0;
+ /* IE6-7 */
+
+ line-height: normal;
+ border: none;
+}
+input[type=file] {
+ background-color: #ffffff;
+ padding: initial;
+ border: initial;
+ line-height: initial;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+}
+input[type=button], input[type=reset], input[type=submit] {
+ width: auto;
+ height: auto;
+}
+select, input[type=file] {
+ height: 27px;
+ *height: auto;
+ line-height: 27px;
+ *margin-top: 4px;
+ /* For IE7, add top margin to align select with labels */
+
+}
+select[multiple] {
+ height: inherit;
+ background-color: #ffffff;
+}
+textarea {
+ height: auto;
+}
+.uneditable-input {
+ background-color: #ffffff;
+ display: block;
+ border-color: #eee;
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+ cursor: not-allowed;
+}
+:-moz-placeholder {
+ color: #bfbfbf;
+}
+::-webkit-input-placeholder {
+ color: #bfbfbf;
+}
+input, textarea {
+ -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+ -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+ -ms-transition: border linear 0.2s, box-shadow linear 0.2s;
+ -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+ transition: border linear 0.2s, box-shadow linear 0.2s;
+ -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+input:focus, textarea:focus {
+ outline: 0;
+ border-color: rgba(82, 168, 236, 0.8);
+ -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
+ -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
+}
+input[type=file]:focus, input[type=checkbox]:focus, select:focus {
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ outline: 1px dotted #666;
+}
+form .clearfix.error > label, form .clearfix.error .help-block, form .clearfix.error .help-inline {
+ color: #b94a48;
+}
+form .clearfix.error input, form .clearfix.error textarea {
+ color: #b94a48;
+ border-color: #ee5f5b;
+}
+form .clearfix.error input:focus, form .clearfix.error textarea:focus {
+ border-color: #e9322d;
+ -webkit-box-shadow: 0 0 6px #f8b9b7;
+ -moz-box-shadow: 0 0 6px #f8b9b7;
+ box-shadow: 0 0 6px #f8b9b7;
+}
+form .clearfix.error .input-prepend .add-on, form .clearfix.error .input-append .add-on {
+ color: #b94a48;
+ background-color: #fce6e6;
+ border-color: #b94a48;
+}
+form .clearfix.warning > label, form .clearfix.warning .help-block, form .clearfix.warning .help-inline {
+ color: #c09853;
+}
+form .clearfix.warning input, form .clearfix.warning textarea {
+ color: #c09853;
+ border-color: #ccae64;
+}
+form .clearfix.warning input:focus, form .clearfix.warning textarea:focus {
+ border-color: #be9a3f;
+ -webkit-box-shadow: 0 0 6px #e5d6b1;
+ -moz-box-shadow: 0 0 6px #e5d6b1;
+ box-shadow: 0 0 6px #e5d6b1;
+}
+form .clearfix.warning .input-prepend .add-on, form .clearfix.warning .input-append .add-on {
+ color: #c09853;
+ background-color: #d2b877;
+ border-color: #c09853;
+}
+form .clearfix.success > label, form .clearfix.success .help-block, form .clearfix.success .help-inline {
+ color: #468847;
+}
+form .clearfix.success input, form .clearfix.success textarea {
+ color: #468847;
+ border-color: #57a957;
+}
+form .clearfix.success input:focus, form .clearfix.success textarea:focus {
+ border-color: #458845;
+ -webkit-box-shadow: 0 0 6px #9acc9a;
+ -moz-box-shadow: 0 0 6px #9acc9a;
+ box-shadow: 0 0 6px #9acc9a;
+}
+form .clearfix.success .input-prepend .add-on, form .clearfix.success .input-append .add-on {
+ color: #468847;
+ background-color: #bcddbc;
+ border-color: #468847;
+}
+.input-mini,
+input.mini,
+textarea.mini,
+select.mini {
+ width: 60px;
+}
+.input-small,
+input.small,
+textarea.small,
+select.small {
+ width: 90px;
+}
+.input-medium,
+input.medium,
+textarea.medium,
+select.medium {
+ width: 150px;
+}
+.input-large,
+input.large,
+textarea.large,
+select.large {
+ width: 210px;
+}
+.input-xlarge,
+input.xlarge,
+textarea.xlarge,
+select.xlarge {
+ width: 270px;
+}
+.input-xxlarge,
+input.xxlarge,
+textarea.xxlarge,
+select.xxlarge {
+ width: 530px;
+}
+textarea.xxlarge {
+ overflow-y: auto;
+}
+input.span1, textarea.span1 {
+ display: inline-block;
+ float: none;
+ width: 30px;
+ margin-left: 0;
+}
+input.span2, textarea.span2 {
+ display: inline-block;
+ float: none;
+ width: 90px;
+ margin-left: 0;
+}
+input.span3, textarea.span3 {
+ display: inline-block;
+ float: none;
+ width: 150px;
+ margin-left: 0;
+}
+input.span4, textarea.span4 {
+ display: inline-block;
+ float: none;
+ width: 210px;
+ margin-left: 0;
+}
+input.span5, textarea.span5 {
+ display: inline-block;
+ float: none;
+ width: 270px;
+ margin-left: 0;
+}
+input.span6, textarea.span6 {
+ display: inline-block;
+ float: none;
+ width: 330px;
+ margin-left: 0;
+}
+input.span7, textarea.span7 {
+ display: inline-block;
+ float: none;
+ width: 390px;
+ margin-left: 0;
+}
+input.span8, textarea.span8 {
+ display: inline-block;
+ float: none;
+ width: 450px;
+ margin-left: 0;
+}
+input.span9, textarea.span9 {
+ display: inline-block;
+ float: none;
+ width: 510px;
+ margin-left: 0;
+}
+input.span10, textarea.span10 {
+ display: inline-block;
+ float: none;
+ width: 570px;
+ margin-left: 0;
+}
+input.span11, textarea.span11 {
+ display: inline-block;
+ float: none;
+ width: 630px;
+ margin-left: 0;
+}
+input.span12, textarea.span12 {
+ display: inline-block;
+ float: none;
+ width: 690px;
+ margin-left: 0;
+}
+input.span13, textarea.span13 {
+ display: inline-block;
+ float: none;
+ width: 750px;
+ margin-left: 0;
+}
+input.span14, textarea.span14 {
+ display: inline-block;
+ float: none;
+ width: 810px;
+ margin-left: 0;
+}
+input.span15, textarea.span15 {
+ display: inline-block;
+ float: none;
+ width: 870px;
+ margin-left: 0;
+}
+input.span16, textarea.span16 {
+ display: inline-block;
+ float: none;
+ width: 930px;
+ margin-left: 0;
+}
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+ background-color: #f5f5f5;
+ border-color: #ddd;
+ cursor: not-allowed;
+}
+.actions {
+ background: #f5f5f5;
+ margin-top: 18px;
+ margin-bottom: 18px;
+ padding: 17px 20px 18px 150px;
+ border-top: 1px solid #ddd;
+ -webkit-border-radius: 0 0 3px 3px;
+ -moz-border-radius: 0 0 3px 3px;
+ border-radius: 0 0 3px 3px;
+}
+.actions .secondary-action {
+ float: right;
+}
+.actions .secondary-action a {
+ line-height: 30px;
+}
+.actions .secondary-action a:hover {
+ text-decoration: underline;
+}
+.help-inline, .help-block {
+ font-size: 13px;
+ line-height: 18px;
+ color: #bfbfbf;
+}
+.help-inline {
+ padding-left: 5px;
+ *position: relative;
+ /* IE6-7 */
+
+ *top: -5px;
+ /* IE6-7 */
+
+}
+.help-block {
+ display: block;
+ max-width: 600px;
+}
+.inline-inputs {
+ color: #808080;
+}
+.inline-inputs span {
+ padding: 0 2px 0 1px;
+}
+.input-prepend input, .input-append input {
+ -webkit-border-radius: 0 3px 3px 0;
+ -moz-border-radius: 0 3px 3px 0;
+ border-radius: 0 3px 3px 0;
+}
+.input-prepend .add-on, .input-append .add-on {
+ position: relative;
+ background: #f5f5f5;
+ border: 1px solid #ccc;
+ z-index: 2;
+ float: left;
+ display: block;
+ width: auto;
+ min-width: 16px;
+ height: 18px;
+ padding: 4px 4px 4px 5px;
+ margin-right: -1px;
+ font-weight: normal;
+ line-height: 18px;
+ color: #bfbfbf;
+ text-align: center;
+ text-shadow: 0 1px 0 #ffffff;
+ -webkit-border-radius: 3px 0 0 3px;
+ -moz-border-radius: 3px 0 0 3px;
+ border-radius: 3px 0 0 3px;
+}
+.input-prepend .active, .input-append .active {
+ background: #a9dba9;
+ border-color: #46a546;
+}
+.input-prepend .add-on {
+ *margin-top: 1px;
+ /* IE6-7 */
+
+}
+.input-append input {
+ float: left;
+ -webkit-border-radius: 3px 0 0 3px;
+ -moz-border-radius: 3px 0 0 3px;
+ border-radius: 3px 0 0 3px;
+}
+.input-append .add-on {
+ -webkit-border-radius: 0 3px 3px 0;
+ -moz-border-radius: 0 3px 3px 0;
+ border-radius: 0 3px 3px 0;
+ margin-right: 0;
+ margin-left: -1px;
+}
+.inputs-list {
+ margin: 0 0 5px;
+ width: 100%;
+}
+.inputs-list li {
+ display: block;
+ padding: 0;
+ width: 100%;
+}
+.inputs-list label {
+ display: block;
+ float: none;
+ width: auto;
+ padding: 0;
+ margin-left: 20px;
+ line-height: 18px;
+ text-align: left;
+ white-space: normal;
+}
+.inputs-list label strong {
+ color: #808080;
+}
+.inputs-list label small {
+ font-size: 11px;
+ font-weight: normal;
+}
+.inputs-list .inputs-list {
+ margin-left: 25px;
+ margin-bottom: 10px;
+ padding-top: 0;
+}
+.inputs-list:first-child {
+ padding-top: 6px;
+}
+.inputs-list li + li {
+ padding-top: 2px;
+}
+.inputs-list input[type=radio], .inputs-list input[type=checkbox] {
+ margin-bottom: 0;
+ margin-left: -20px;
+ float: left;
+}
+.form-stacked {
+ padding-left: 20px;
+}
+.form-stacked fieldset {
+ padding-top: 9px;
+}
+.form-stacked legend {
+ padding-left: 0;
+}
+.form-stacked label {
+ display: block;
+ float: none;
+ width: auto;
+ font-weight: bold;
+ text-align: left;
+ line-height: 20px;
+ padding-top: 0;
+}
+.form-stacked .clearfix {
+ margin-bottom: 9px;
+}
+.form-stacked .clearfix div.input {
+ margin-left: 0;
+}
+.form-stacked .inputs-list {
+ margin-bottom: 0;
+}
+.form-stacked .inputs-list li {
+ padding-top: 0;
+}
+.form-stacked .inputs-list li label {
+ font-weight: normal;
+ padding-top: 0;
+}
+.form-stacked div.clearfix.error {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ padding-left: 10px;
+ margin-top: 0;
+ margin-left: -10px;
+}
+.form-stacked .actions {
+ margin-left: -20px;
+ padding-left: 20px;
+}
+/*
+ * Tables.less
+ * Tables for, you guessed it, tabular data
+ * ---------------------------------------- */
+table {
+ width: 100%;
+ margin-bottom: 18px;
+ padding: 0;
+ font-size: 13px;
+ border-collapse: collapse;
+}
+table th, table td {
+ padding: 10px 10px 9px;
+ line-height: 18px;
+ text-align: left;
+}
+table th {
+ padding-top: 9px;
+ font-weight: bold;
+ vertical-align: middle;
+}
+table td {
+ vertical-align: top;
+ border-top: 1px solid #ddd;
+}
+table tbody th {
+ border-top: 1px solid #ddd;
+ vertical-align: top;
+}
+.condensed-table th, .condensed-table td {
+ padding: 5px 5px 4px;
+}
+.bordered-table {
+ border: 1px solid #ddd;
+ border-collapse: separate;
+ *border-collapse: collapse;
+ /* IE7, collapse table to remove spacing */
+
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.bordered-table th + th, .bordered-table td + td, .bordered-table th + td {
+ border-left: 1px solid #ddd;
+}
+.bordered-table thead tr:first-child th:first-child, .bordered-table tbody tr:first-child td:first-child {
+ -webkit-border-radius: 4px 0 0 0;
+ -moz-border-radius: 4px 0 0 0;
+ border-radius: 4px 0 0 0;
+}
+.bordered-table thead tr:first-child th:last-child, .bordered-table tbody tr:first-child td:last-child {
+ -webkit-border-radius: 0 4px 0 0;
+ -moz-border-radius: 0 4px 0 0;
+ border-radius: 0 4px 0 0;
+}
+.bordered-table tbody tr:last-child td:first-child {
+ -webkit-border-radius: 0 0 0 4px;
+ -moz-border-radius: 0 0 0 4px;
+ border-radius: 0 0 0 4px;
+}
+.bordered-table tbody tr:last-child td:last-child {
+ -webkit-border-radius: 0 0 4px 0;
+ -moz-border-radius: 0 0 4px 0;
+ border-radius: 0 0 4px 0;
+}
+table .span1 {
+ width: 20px;
+}
+table .span2 {
+ width: 60px;
+}
+table .span3 {
+ width: 100px;
+}
+table .span4 {
+ width: 140px;
+}
+table .span5 {
+ width: 180px;
+}
+table .span6 {
+ width: 220px;
+}
+table .span7 {
+ width: 260px;
+}
+table .span8 {
+ width: 300px;
+}
+table .span9 {
+ width: 340px;
+}
+table .span10 {
+ width: 380px;
+}
+table .span11 {
+ width: 420px;
+}
+table .span12 {
+ width: 460px;
+}
+table .span13 {
+ width: 500px;
+}
+table .span14 {
+ width: 540px;
+}
+table .span15 {
+ width: 580px;
+}
+table .span16 {
+ width: 620px;
+}
+.zebra-striped tbody tr:nth-child(odd) td, .zebra-striped tbody tr:nth-child(odd) th {
+ background-color: #f9f9f9;