├── .gitignore ├── .jscsrc ├── .jshintrc ├── Gruntfile.js ├── LICENSE ├── README.md ├── app.js ├── bin └── www ├── middleware └── site-info.js ├── nodemon.json ├── package.json ├── public ├── css │ └── lib │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap.css │ │ └── bootstrap.min.css ├── favicon.ico ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff ├── images │ └── dark-sharp-edges.png ├── js │ ├── lib │ │ └── jquery.min.js │ └── sidebar.js └── stylus │ ├── mixins.styl │ └── style.styl ├── routes ├── category.js ├── index.js ├── public-router.js ├── single.js ├── tag.js └── users.js ├── services ├── config.js ├── content-cache.js ├── content-service.js ├── page-numbers.js ├── page-title.js └── wp.js └── views ├── archive-category.tmpl ├── archive-tag.tmpl ├── error.tmpl ├── filters ├── every.js ├── format-date.js ├── get-image.js ├── get-month.js ├── get-year.js ├── remove-empty-taxonomies.js ├── sort-by.js └── stringify.js ├── index.tmpl ├── layouts └── main.tmpl ├── partials ├── footer.tmpl ├── global-header.tmpl ├── page-banner.tmpl ├── pagination.tmpl └── sidebar.tmpl └── single.tmpl /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # Compiled binary addons (http://nodejs.org/api/addons.html) 20 | build/Release 21 | 22 | # Dependency directory 23 | # Commenting this out is preferred by some people, see 24 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- 25 | node_modules 26 | 27 | # Users Environment Variables 28 | .lock-wscript 29 | 30 | # Rendered stylesheets 31 | public/css/ 32 | 33 | # Application configuration 34 | config.yml 35 | -------------------------------------------------------------------------------- /.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "requireCurlyBraces": [ 3 | "if", 4 | "else", 5 | "for", 6 | "while", 7 | "do", 8 | "try", 9 | "catch" 10 | ], 11 | "requireOperatorBeforeLineBreak": true, 12 | "requireParenthesesAroundIIFE": true, 13 | "requireCommaBeforeLineBreak": true, 14 | "requireDotNotation": true, 15 | "requireBlocksOnNewline": 1, 16 | "maximumLineLength": { 17 | "value": 100, 18 | "tabSize": 4, 19 | "allowUrlComments": true, 20 | "allowRegex": true 21 | }, 22 | "validateQuoteMarks": { "mark": "'", "escape": true }, 23 | 24 | "disallowMultipleVarDecl": true, 25 | "disallowMixedSpacesAndTabs": "smart", 26 | "disallowTrailingWhitespace": true, 27 | "disallowMultipleLineStrings": true, 28 | "disallowTrailingComma": true, 29 | "validateIndentation": 2, 30 | 31 | "requireSpacesInFunctionExpression": { 32 | "beforeOpeningCurlyBrace": true 33 | }, 34 | "requireSpaceAfterKeywords": [ 35 | "if", 36 | "else", 37 | "for", 38 | "while", 39 | "do", 40 | "switch", 41 | "return", 42 | "try" 43 | ], 44 | "disallowSpaceAfterKeywords": [ 45 | "catch" 46 | ], 47 | "requireSpacesInsideObjectBrackets": "all", 48 | "requireSpacesInsideArrayBrackets": "allButNested", 49 | "requireSpacesInConditionalExpression": true, 50 | "requireSpaceAfterBinaryOperators": true, 51 | "requireLineFeedAtFileEnd": true, 52 | "requireSpaceAfterPrefixUnaryOperators": [ "!" ], 53 | "requireSpaceBeforeBinaryOperators": [ 54 | "=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", 55 | "&=", "|=", "^=", "+=", 56 | 57 | "+", "-", "*", "/", "%", "<<", ">>", ">>>", "&", 58 | "|", "^", "&&", "||", "===", "==", ">=", 59 | "<=", "<", ">", "!=", "!==" 60 | ], 61 | "validateLineBreaks": "LF", 62 | 63 | "disallowKeywords": [ "with" ], 64 | "disallowKeywordsOnNewLine": [ "else" ], 65 | "disallowSpacesInFunctionExpression": { 66 | "beforeOpeningRoundBrace": true 67 | }, 68 | "disallowSpaceAfterObjectKeys": true, 69 | "disallowSpaceAfterPrefixUnaryOperators": [ "++", "--", "+", "-", "~" ], 70 | "disallowSpaceBeforePostfixUnaryOperators": true, 71 | "disallowSpaceBeforeBinaryOperators": [ ",", ":" ], 72 | "disallowMultipleLineBreaks": true 73 | } 74 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "boss": true, 3 | "camelcase": true, 4 | "curly": true, 5 | "eqeqeq": true, 6 | "eqnull": true, 7 | "expr": true, 8 | "immed": true, 9 | "noarg": true, 10 | "onevar": true, 11 | "quotmark": "single", 12 | "strict": true, 13 | "trailing": true, 14 | "undef": true, 15 | "unused": "vars", 16 | 17 | "esnext": true, 18 | "jquery": true, 19 | "node": true 20 | } 21 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var extend = require( 'lodash' ).extend; 3 | 4 | module.exports = function( grunt ) { 5 | 6 | // Reusable file globbing 7 | var files = { 8 | grunt: [ 'Gruntfile.js' ], 9 | lib: [ 10 | 'app.js', 11 | 'middleware/**/*.js', 12 | 'public/**/*.js', 13 | '!public/js/lib/**/*.js', 14 | 'routes/**/*.js', 15 | 'services/**/*.js', 16 | 'views/filters/**/*.js' 17 | ], 18 | tests: [ 'tests/**/*.js' ] 19 | }; 20 | 21 | // Reusable JSHintRC options 22 | var jshintrc = grunt.file.readJSON( '.jshintrc' ); 23 | 24 | // Load tasks. 25 | require( 'load-grunt-tasks' )( grunt ); 26 | 27 | grunt.initConfig({ 28 | 29 | pkg: grunt.file.readJSON( 'package.json' ), 30 | 31 | jscs: { 32 | options: { 33 | config: '.jscsrc', 34 | reporter: require( 'jscs-stylish' ).path 35 | }, 36 | grunt: { 37 | src: files.grunt 38 | }, 39 | lib: { 40 | src: files.lib 41 | }, 42 | tests: { 43 | src: files.tests 44 | } 45 | }, 46 | 47 | jshint: { 48 | options: { 49 | reporter: require( 'jshint-stylish' ) 50 | }, 51 | grunt: { 52 | options: jshintrc, 53 | src: files.grunt 54 | }, 55 | lib: { 56 | options: jshintrc, 57 | src: files.lib 58 | }, 59 | tests: { 60 | options: extend({ 61 | globals: { 62 | 'beforeEach': false, 63 | 'describe': false, 64 | 'it': false 65 | } 66 | }, jshintrc ), 67 | src: files.tests 68 | } 69 | }, 70 | 71 | simplemocha: { 72 | tests: { 73 | src: files.tests, 74 | options: { 75 | reporter: 'nyan' 76 | } 77 | } 78 | }, 79 | 80 | watch: { 81 | lib: { 82 | files: files.lib, 83 | tasks: [ 'jscs:lib', 'jshint:lib', 'simplemocha' ] 84 | }, 85 | tests: { 86 | files: files.tests, 87 | tasks: [ 'jscs:tests', 'jshint:tests', 'simplemocha' ] 88 | } 89 | } 90 | 91 | }); 92 | 93 | grunt.registerTask( 'lint', [ 'jshint', 'jscs' ] ); 94 | grunt.registerTask( 'test', [ 'simplemocha' ] ); 95 | grunt.registerTask( 'default', [ 'lint', 'test' ] ); 96 | }; 97 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 K.Adam White 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ExpressPress 2 | 3 | This project is a demonstration of how WordPress can be used to provide content for an application written in Node.js, a server-side JavaScript runtime. WordPress is a mature and powerful content management system, with a longer history and better non-developer usability than many of the options available natively in Node. With the help of the WordPress REST API plugin (which is targeted for integration with WordPress core some time in 2015), you can leverage the excellent content-editing interface and data store of WordPress from any Node app. 4 | 5 | ExpressPress itself is a lightweight blog viewer, which will serve the content from your WP-API-enabled WordPress site. It uses the wordpress-rest-api NPM module to query resources under the WP-API endpoint. 6 | 7 | ## Installation 8 | 9 | To run ExpressPress locally (which we recommend, as this is first and foremost a learning resource), follow the following steps. 10 | 11 | 1. Clone this repository 12 | 2. Install Node.js (On OSX, we recommend installing Node via Homebrew) 13 | 3. Inside the cloned repository directory, run `npm install` to install the dependencies 14 | 4. Create a file called "config.yml" within the repository directory, with the following content (see the WP-API project for instructions on installing and enabling the API plugin): 15 | 16 | ```yml 17 | # careful: yaml syntax requires spaces, NOT tabs! 18 | wordpress: 19 | endpoint: 'http://www.your-api-enabled-wp-site.com/wp-json' 20 | cacheLimit: 3600000 # 1000ms * 60s * 60m = 1hr 21 | ``` 22 | 5. From the command-line, run `npm start` to run the application. 23 | - To run on a specific port, run `PORT=XXXX npm start`, where XXXX is a valid http port e.g. `8080`. 24 | 6. Visit http://localhost:3000 (or whatever port you specified) to view your site 25 | 7. Alter the code, learn how it works, add new routes, & experiment! The server will automatically restart if you change any server-side files. 26 | 27 | ## Credits 28 | 29 | Thanks to Tim Branyen, Carl Danley, Irene Ros, Brendan McLoughlin and everyone else at Bocoup for their assistance in reviewing and supporting this project! 30 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var express = require( 'express' ); 4 | var path = require( 'path' ); 5 | var favicon = require( 'serve-favicon' ); 6 | var logger = require( 'morgan' ); 7 | var cookieParser = require( 'cookie-parser' ); 8 | var bodyParser = require( 'body-parser' ); 9 | 10 | var combynExpress = require( 'combynexpress' ); 11 | var stylus = require( 'stylus' ); 12 | 13 | var app = express(); 14 | 15 | // View engine setup 16 | app.engine( 'tmpl', combynExpress() ); 17 | app.set('view engine', 'tmpl'); 18 | 19 | // Middleware setup 20 | app.use( favicon( __dirname + '/public/favicon.ico' ) ); 21 | app.use( logger( 'dev' ) ); 22 | app.use( bodyParser.json() ); 23 | app.use( bodyParser.urlencoded({ 24 | extended: false 25 | })); 26 | app.use( cookieParser() ); 27 | 28 | // Support stylus & serve static assets 29 | function compileStylus( str, path ) { 30 | return stylus( str ) 31 | .set( 'filename', path ) 32 | // .set( 'sourcemap', true ) 33 | .set( 'compress', true ); 34 | } 35 | 36 | app.use( stylus.middleware({ 37 | src: path.join( __dirname, 'public/stylus' ), 38 | dest: path.join( __dirname, 'public/css' ), 39 | compile: compileStylus 40 | }) ); 41 | 42 | app.use( express.static( path.join( __dirname, 'public' ) ) ); 43 | 44 | // Require the public router 45 | app.use( '/', require( './routes/public-router' ) ); 46 | 47 | module.exports = app; 48 | -------------------------------------------------------------------------------- /bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | var debug = require('debug')('nodepress'); 3 | var app = require('../app'); 4 | 5 | app.set('port', process.env.PORT || 3000); 6 | 7 | var server = app.listen(app.get('port'), function() { 8 | debug('Express server listening on port ' + server.address().port); 9 | }); 10 | -------------------------------------------------------------------------------- /middleware/site-info.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var contentService = require( '../services/content-service' ); 4 | 5 | // Add the absolute url to the locals object so it is available in templates. 6 | // This is mainly used for the social media sharing links, to provide the 7 | // absolute URL to the page being shared. 8 | module.exports = function(req, res, next) { 9 | contentService.siteInfo().then(function( info ) { 10 | // Add site info as a local 11 | res.locals.site = { 12 | name: info.name, 13 | description: info.description 14 | }; 15 | // Continue with the request chain 16 | }).then( next.bind( null, null ), next ); 17 | }; 18 | -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "verbose": false, 3 | "watch": [ 4 | "bin", 5 | "middleware", 6 | "routes", 7 | "services", 8 | "views", 9 | "app.js", 10 | "config.yml" 11 | ], 12 | "ext": "js,tmpl,yml" 13 | } 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodepress", 3 | "version": "0.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "private": true, 7 | "scripts": { 8 | "postinstall": "grunt", 9 | "start": "nodemon ./bin/www", 10 | "debug": "nodemon --exec node-debug ./bin/www", 11 | "lint": "grunt lint", 12 | "test": "grunt test" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/kadamwhite/nodepress.git" 17 | }, 18 | "author": "K.Adam White (http://www.kadamwhite.com/)", 19 | "license": "ISC", 20 | "bugs": { 21 | "url": "https://github.com/kadamwhite/nodepress/issues" 22 | }, 23 | "homepage": "https://github.com/kadamwhite/nodepress", 24 | "devDependencies": { 25 | "chai": "^1.9.2", 26 | "chai-as-promised": "^4.1.1", 27 | "cliff": "^0.1.9", 28 | "grunt": "^0.4.5", 29 | "grunt-cli": "^0.1.13", 30 | "grunt-contrib-jshint": "^0.10.0", 31 | "grunt-contrib-watch": "^0.6.1", 32 | "grunt-jscs": "^0.7.1", 33 | "grunt-newer": "^0.7.0", 34 | "grunt-simple-mocha": "^0.4.0", 35 | "jscs-stylish": "^0.3.0", 36 | "jshint-stylish": "^1.0.0", 37 | "load-grunt-tasks": "^0.6.0", 38 | "mocha": "^1.21.5", 39 | "node-inspector": "^0.7.4", 40 | "sinon": "^1.10.3", 41 | "sinon-chai": "^2.6.0" 42 | }, 43 | "dependencies": { 44 | "body-parser": "^1.9.0", 45 | "combynexpress": "^0.6.3", 46 | "cookie-parser": "^1.3.3", 47 | "debug": "^2.0.0", 48 | "express": "^4.9.7", 49 | "js-yaml": "^3.2.2", 50 | "lodash": "^2.4.1", 51 | "lru-cache": "^2.5.0", 52 | "morgan": "^1.3.2", 53 | "nodemon": "^1.3.7", 54 | "rsvp": "^3.0.14", 55 | "serve-favicon": "^2.1.5", 56 | "stripcolorcodes": "^0.1.0", 57 | "stylus": "^0.49.2", 58 | "wordpress-rest-api": "^0.3.0" 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /public/css/lib/bootstrap-theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.2.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | /*! 8 | * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=6b1dc903442532ce077c) 9 | * Config saved to config.json and https://gist.github.com/6b1dc903442532ce077c 10 | */ 11 | .btn-default, 12 | .btn-primary, 13 | .btn-success, 14 | .btn-info, 15 | .btn-warning, 16 | .btn-danger { 17 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); 18 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); 19 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); 20 | } 21 | .btn-default:active, 22 | .btn-primary:active, 23 | .btn-success:active, 24 | .btn-info:active, 25 | .btn-warning:active, 26 | .btn-danger:active, 27 | .btn-default.active, 28 | .btn-primary.active, 29 | .btn-success.active, 30 | .btn-info.active, 31 | .btn-warning.active, 32 | .btn-danger.active { 33 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); 34 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); 35 | } 36 | .btn:active, 37 | .btn.active { 38 | background-image: none; 39 | } 40 | .btn-default { 41 | background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); 42 | background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); 43 | background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%); 44 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); 45 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 46 | background-repeat: repeat-x; 47 | border-color: #dbdbdb; 48 | text-shadow: 0 1px 0 #fff; 49 | border-color: #ccc; 50 | } 51 | .btn-default:hover, 52 | .btn-default:focus { 53 | background-color: #e0e0e0; 54 | background-position: 0 -15px; 55 | } 56 | .btn-default:active, 57 | .btn-default.active { 58 | background-color: #e0e0e0; 59 | border-color: #dbdbdb; 60 | } 61 | .btn-default:disabled, 62 | .btn-default[disabled] { 63 | background-color: #e0e0e0; 64 | background-image: none; 65 | } 66 | .btn-primary { 67 | background-image: -webkit-linear-gradient(top, #84bfed 0%, #4fa3e5 100%); 68 | background-image: -o-linear-gradient(top, #84bfed 0%, #4fa3e5 100%); 69 | background-image: linear-gradient(to bottom, #84bfed 0%, #4fa3e5 100%); 70 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff84bfed', endColorstr='#ff4fa3e5', GradientType=0); 71 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 72 | background-repeat: repeat-x; 73 | border-color: #469fe4; 74 | } 75 | .btn-primary:hover, 76 | .btn-primary:focus { 77 | background-color: #4fa3e5; 78 | background-position: 0 -15px; 79 | } 80 | .btn-primary:active, 81 | .btn-primary.active { 82 | background-color: #4fa3e5; 83 | border-color: #469fe4; 84 | } 85 | .btn-primary:disabled, 86 | .btn-primary[disabled] { 87 | background-color: #4fa3e5; 88 | background-image: none; 89 | } 90 | .btn-success { 91 | background-image: -webkit-linear-gradient(top, #975bfb 0%, #711ffa 100%); 92 | background-image: -o-linear-gradient(top, #975bfb 0%, #711ffa 100%); 93 | background-image: linear-gradient(to bottom, #975bfb 0%, #711ffa 100%); 94 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff975bfb', endColorstr='#ff711ffa', GradientType=0); 95 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 96 | background-repeat: repeat-x; 97 | border-color: #6b15f9; 98 | } 99 | .btn-success:hover, 100 | .btn-success:focus { 101 | background-color: #711ffa; 102 | background-position: 0 -15px; 103 | } 104 | .btn-success:active, 105 | .btn-success.active { 106 | background-color: #711ffa; 107 | border-color: #6b15f9; 108 | } 109 | .btn-success:disabled, 110 | .btn-success[disabled] { 111 | background-color: #711ffa; 112 | background-image: none; 113 | } 114 | .btn-info { 115 | background-image: -webkit-linear-gradient(top, #f2d890 0%, #ecc559 100%); 116 | background-image: -o-linear-gradient(top, #f2d890 0%, #ecc559 100%); 117 | background-image: linear-gradient(to bottom, #f2d890 0%, #ecc559 100%); 118 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2d890', endColorstr='#ffecc559', GradientType=0); 119 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 120 | background-repeat: repeat-x; 121 | border-color: #ebc250; 122 | } 123 | .btn-info:hover, 124 | .btn-info:focus { 125 | background-color: #ecc559; 126 | background-position: 0 -15px; 127 | } 128 | .btn-info:active, 129 | .btn-info.active { 130 | background-color: #ecc559; 131 | border-color: #ebc250; 132 | } 133 | .btn-info:disabled, 134 | .btn-info[disabled] { 135 | background-color: #ecc559; 136 | background-image: none; 137 | } 138 | .btn-warning { 139 | background-image: -webkit-linear-gradient(top, #dda409 0%, #a27807 100%); 140 | background-image: -o-linear-gradient(top, #dda409 0%, #a27807 100%); 141 | background-image: linear-gradient(to bottom, #dda409 0%, #a27807 100%); 142 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdda409', endColorstr='#ffa27807', GradientType=0); 143 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 144 | background-repeat: repeat-x; 145 | border-color: #987106; 146 | } 147 | .btn-warning:hover, 148 | .btn-warning:focus { 149 | background-color: #a27807; 150 | background-position: 0 -15px; 151 | } 152 | .btn-warning:active, 153 | .btn-warning.active { 154 | background-color: #a27807; 155 | border-color: #987106; 156 | } 157 | .btn-warning:disabled, 158 | .btn-warning[disabled] { 159 | background-color: #a27807; 160 | background-image: none; 161 | } 162 | .btn-danger { 163 | background-image: -webkit-linear-gradient(top, #e2592a 0%, #b64119 100%); 164 | background-image: -o-linear-gradient(top, #e2592a 0%, #b64119 100%); 165 | background-image: linear-gradient(to bottom, #e2592a 0%, #b64119 100%); 166 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe2592a', endColorstr='#ffb64119', GradientType=0); 167 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 168 | background-repeat: repeat-x; 169 | border-color: #ad3e18; 170 | } 171 | .btn-danger:hover, 172 | .btn-danger:focus { 173 | background-color: #b64119; 174 | background-position: 0 -15px; 175 | } 176 | .btn-danger:active, 177 | .btn-danger.active { 178 | background-color: #b64119; 179 | border-color: #ad3e18; 180 | } 181 | .btn-danger:disabled, 182 | .btn-danger[disabled] { 183 | background-color: #b64119; 184 | background-image: none; 185 | } 186 | .thumbnail, 187 | .img-thumbnail { 188 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); 189 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); 190 | } 191 | .dropdown-menu > li > a:hover, 192 | .dropdown-menu > li > a:focus { 193 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 194 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 195 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 196 | background-repeat: repeat-x; 197 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 198 | background-color: #e8e8e8; 199 | } 200 | .dropdown-menu > .active > a, 201 | .dropdown-menu > .active > a:hover, 202 | .dropdown-menu > .active > a:focus { 203 | background-image: -webkit-linear-gradient(top, #84bfed 0%, #6eb3ea 100%); 204 | background-image: -o-linear-gradient(top, #84bfed 0%, #6eb3ea 100%); 205 | background-image: linear-gradient(to bottom, #84bfed 0%, #6eb3ea 100%); 206 | background-repeat: repeat-x; 207 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff84bfed', endColorstr='#ff6eb3ea', GradientType=0); 208 | background-color: #6eb3ea; 209 | } 210 | .navbar-default { 211 | background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); 212 | background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); 213 | background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); 214 | background-repeat: repeat-x; 215 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); 216 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 217 | border-radius: 0; 218 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); 219 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); 220 | } 221 | .navbar-default .navbar-nav > .active > a { 222 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); 223 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); 224 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); 225 | background-repeat: repeat-x; 226 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); 227 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); 228 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); 229 | } 230 | .navbar-brand, 231 | .navbar-nav > li > a { 232 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); 233 | } 234 | .navbar-inverse { 235 | background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%); 236 | background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%); 237 | background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); 238 | background-repeat: repeat-x; 239 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); 240 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 241 | } 242 | .navbar-inverse .navbar-nav > .active > a { 243 | background-image: -webkit-linear-gradient(top, #222222 0%, #282828 100%); 244 | background-image: -o-linear-gradient(top, #222222 0%, #282828 100%); 245 | background-image: linear-gradient(to bottom, #222222 0%, #282828 100%); 246 | background-repeat: repeat-x; 247 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); 248 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); 249 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); 250 | } 251 | .navbar-inverse .navbar-brand, 252 | .navbar-inverse .navbar-nav > li > a { 253 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 254 | } 255 | .navbar-static-top, 256 | .navbar-fixed-top, 257 | .navbar-fixed-bottom { 258 | border-radius: 0; 259 | } 260 | .alert { 261 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); 262 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); 263 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); 264 | } 265 | .alert-success { 266 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 267 | background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 268 | background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); 269 | background-repeat: repeat-x; 270 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); 271 | border-color: #b2dba1; 272 | } 273 | .alert-info { 274 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 275 | background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 276 | background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); 277 | background-repeat: repeat-x; 278 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); 279 | border-color: #9acfea; 280 | } 281 | .alert-warning { 282 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 283 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 284 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); 285 | background-repeat: repeat-x; 286 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); 287 | border-color: #f5e79e; 288 | } 289 | .alert-danger { 290 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 291 | background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 292 | background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); 293 | background-repeat: repeat-x; 294 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); 295 | border-color: #dca7a7; 296 | } 297 | .progress { 298 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 299 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 300 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); 301 | background-repeat: repeat-x; 302 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); 303 | } 304 | .progress-bar { 305 | background-image: -webkit-linear-gradient(top, #84bfed 0%, #58a8e6 100%); 306 | background-image: -o-linear-gradient(top, #84bfed 0%, #58a8e6 100%); 307 | background-image: linear-gradient(to bottom, #84bfed 0%, #58a8e6 100%); 308 | background-repeat: repeat-x; 309 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff84bfed', endColorstr='#ff58a8e6', GradientType=0); 310 | } 311 | .progress-bar-success { 312 | background-image: -webkit-linear-gradient(top, #975bfb 0%, #7729fa 100%); 313 | background-image: -o-linear-gradient(top, #975bfb 0%, #7729fa 100%); 314 | background-image: linear-gradient(to bottom, #975bfb 0%, #7729fa 100%); 315 | background-repeat: repeat-x; 316 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff975bfb', endColorstr='#ff7729fa', GradientType=0); 317 | } 318 | .progress-bar-info { 319 | background-image: -webkit-linear-gradient(top, #f2d890 0%, #edc862 100%); 320 | background-image: -o-linear-gradient(top, #f2d890 0%, #edc862 100%); 321 | background-image: linear-gradient(to bottom, #f2d890 0%, #edc862 100%); 322 | background-repeat: repeat-x; 323 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2d890', endColorstr='#ffedc862', GradientType=0); 324 | } 325 | .progress-bar-warning { 326 | background-image: -webkit-linear-gradient(top, #dda409 0%, #ac8007 100%); 327 | background-image: -o-linear-gradient(top, #dda409 0%, #ac8007 100%); 328 | background-image: linear-gradient(to bottom, #dda409 0%, #ac8007 100%); 329 | background-repeat: repeat-x; 330 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdda409', endColorstr='#ffac8007', GradientType=0); 331 | } 332 | .progress-bar-danger { 333 | background-image: -webkit-linear-gradient(top, #e2592a 0%, #bf441a 100%); 334 | background-image: -o-linear-gradient(top, #e2592a 0%, #bf441a 100%); 335 | background-image: linear-gradient(to bottom, #e2592a 0%, #bf441a 100%); 336 | background-repeat: repeat-x; 337 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe2592a', endColorstr='#ffbf441a', GradientType=0); 338 | } 339 | .progress-bar-striped { 340 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 341 | background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 342 | background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 343 | } 344 | .list-group { 345 | border-radius: 0; 346 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); 347 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); 348 | } 349 | .list-group-item.active, 350 | .list-group-item.active:hover, 351 | .list-group-item.active:focus { 352 | text-shadow: 0 -1px 0 #58a8e6; 353 | background-image: -webkit-linear-gradient(top, #84bfed 0%, #63aee8 100%); 354 | background-image: -o-linear-gradient(top, #84bfed 0%, #63aee8 100%); 355 | background-image: linear-gradient(to bottom, #84bfed 0%, #63aee8 100%); 356 | background-repeat: repeat-x; 357 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff84bfed', endColorstr='#ff63aee8', GradientType=0); 358 | border-color: #63aee8; 359 | } 360 | .panel { 361 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); 362 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); 363 | } 364 | .panel-default > .panel-heading { 365 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 366 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 367 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 368 | background-repeat: repeat-x; 369 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 370 | } 371 | .panel-primary > .panel-heading { 372 | background-image: -webkit-linear-gradient(top, #84bfed 0%, #6eb3ea 100%); 373 | background-image: -o-linear-gradient(top, #84bfed 0%, #6eb3ea 100%); 374 | background-image: linear-gradient(to bottom, #84bfed 0%, #6eb3ea 100%); 375 | background-repeat: repeat-x; 376 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff84bfed', endColorstr='#ff6eb3ea', GradientType=0); 377 | } 378 | .panel-success > .panel-heading { 379 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 380 | background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 381 | background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); 382 | background-repeat: repeat-x; 383 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); 384 | } 385 | .panel-info > .panel-heading { 386 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 387 | background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 388 | background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); 389 | background-repeat: repeat-x; 390 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); 391 | } 392 | .panel-warning > .panel-heading { 393 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 394 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 395 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); 396 | background-repeat: repeat-x; 397 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); 398 | } 399 | .panel-danger > .panel-heading { 400 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 401 | background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 402 | background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); 403 | background-repeat: repeat-x; 404 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); 405 | } 406 | .well { 407 | background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 408 | background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 409 | background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); 410 | background-repeat: repeat-x; 411 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); 412 | border-color: #dcdcdc; 413 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); 414 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); 415 | } 416 | -------------------------------------------------------------------------------- /public/css/lib/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.2.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | /*! 8 | * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=6b1dc903442532ce077c) 9 | * Config saved to config.json and https://gist.github.com/6b1dc903442532ce077c 10 | */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-o-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top, #84bfed 0, #4fa3e5 100%);background-image:-o-linear-gradient(top, #84bfed 0, #4fa3e5 100%);background-image:linear-gradient(to bottom, #84bfed 0, #4fa3e5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff84bfed', endColorstr='#ff4fa3e5', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#469fe4}.btn-primary:hover,.btn-primary:focus{background-color:#4fa3e5;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#4fa3e5;border-color:#469fe4}.btn-primary:disabled,.btn-primary[disabled]{background-color:#4fa3e5;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top, #975bfb 0, #711ffa 100%);background-image:-o-linear-gradient(top, #975bfb 0, #711ffa 100%);background-image:linear-gradient(to bottom, #975bfb 0, #711ffa 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff975bfb', endColorstr='#ff711ffa', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#6b15f9}.btn-success:hover,.btn-success:focus{background-color:#711ffa;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#711ffa;border-color:#6b15f9}.btn-success:disabled,.btn-success[disabled]{background-color:#711ffa;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top, #f2d890 0, #ecc559 100%);background-image:-o-linear-gradient(top, #f2d890 0, #ecc559 100%);background-image:linear-gradient(to bottom, #f2d890 0, #ecc559 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2d890', endColorstr='#ffecc559', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#ebc250}.btn-info:hover,.btn-info:focus{background-color:#ecc559;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#ecc559;border-color:#ebc250}.btn-info:disabled,.btn-info[disabled]{background-color:#ecc559;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top, #dda409 0, #a27807 100%);background-image:-o-linear-gradient(top, #dda409 0, #a27807 100%);background-image:linear-gradient(to bottom, #dda409 0, #a27807 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdda409', endColorstr='#ffa27807', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#987106}.btn-warning:hover,.btn-warning:focus{background-color:#a27807;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#a27807;border-color:#987106}.btn-warning:disabled,.btn-warning[disabled]{background-color:#a27807;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top, #e2592a 0, #b64119 100%);background-image:-o-linear-gradient(top, #e2592a 0, #b64119 100%);background-image:linear-gradient(to bottom, #e2592a 0, #b64119 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe2592a', endColorstr='#ffb64119', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#ad3e18}.btn-danger:hover,.btn-danger:focus{background-color:#b64119;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#b64119;border-color:#ad3e18}.btn-danger:disabled,.btn-danger[disabled]{background-color:#b64119;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-image:-webkit-linear-gradient(top, #84bfed 0, #6eb3ea 100%);background-image:-o-linear-gradient(top, #84bfed 0, #6eb3ea 100%);background-image:linear-gradient(to bottom, #84bfed 0, #6eb3ea 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff84bfed', endColorstr='#ff6eb3ea', GradientType=0);background-color:#6eb3ea}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-o-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:0;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f3f3f3 100%);background-image:-o-linear-gradient(top, #ebebeb 0, #f3f3f3 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-o-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #222 0, #282828 100%);background-image:-o-linear-gradient(top, #222 0, #282828 100%);background-image:linear-gradient(to bottom, #222 0, #282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:-o-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #84bfed 0, #58a8e6 100%);background-image:-o-linear-gradient(top, #84bfed 0, #58a8e6 100%);background-image:linear-gradient(to bottom, #84bfed 0, #58a8e6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff84bfed', endColorstr='#ff58a8e6', GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top, #975bfb 0, #7729fa 100%);background-image:-o-linear-gradient(top, #975bfb 0, #7729fa 100%);background-image:linear-gradient(to bottom, #975bfb 0, #7729fa 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff975bfb', endColorstr='#ff7729fa', GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #f2d890 0, #edc862 100%);background-image:-o-linear-gradient(top, #f2d890 0, #edc862 100%);background-image:linear-gradient(to bottom, #f2d890 0, #edc862 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2d890', endColorstr='#ffedc862', GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #dda409 0, #ac8007 100%);background-image:-o-linear-gradient(top, #dda409 0, #ac8007 100%);background-image:linear-gradient(to bottom, #dda409 0, #ac8007 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdda409', endColorstr='#ffac8007', GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #e2592a 0, #bf441a 100%);background-image:-o-linear-gradient(top, #e2592a 0, #bf441a 100%);background-image:linear-gradient(to bottom, #e2592a 0, #bf441a 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe2592a', endColorstr='#ffbf441a', GradientType=0)}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.list-group{border-radius:0;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #58a8e6;background-image:-webkit-linear-gradient(top, #84bfed 0, #63aee8 100%);background-image:-o-linear-gradient(top, #84bfed 0, #63aee8 100%);background-image:linear-gradient(to bottom, #84bfed 0, #63aee8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff84bfed', endColorstr='#ff63aee8', GradientType=0);border-color:#63aee8}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #84bfed 0, #6eb3ea 100%);background-image:-o-linear-gradient(top, #84bfed 0, #6eb3ea 100%);background-image:linear-gradient(to bottom, #84bfed 0, #6eb3ea 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff84bfed', endColorstr='#ff6eb3ea', GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-o-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} -------------------------------------------------------------------------------- /public/css/lib/bootstrap.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.2.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | /*! 8 | * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=6b1dc903442532ce077c) 9 | * Config saved to config.json and https://gist.github.com/6b1dc903442532ce077c 10 | *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('/fonts/glyphicons-halflings-regular.eot');src:url('/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('/fonts/glyphicons-halflings-regular.woff') format('woff'),url('/fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#84bfed;text-decoration:none}a:hover,a:focus{color:#419ce3;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:3px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;width:100% \9;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:Palatino,"Palatino LT STD","Palatino Linotype","Book Antiqua",Georgia,serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:480px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#84bfed}a.text-primary:hover{color:#58a8e6}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#84bfed}a.bg-primary:hover{background-color:#58a8e6}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:"Lucida Sans Typewriter","Lucida Console",Monaco,"Bitstream Vera Sans Mono",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:0}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:0;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:0}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:480px){.container{width:750px}}@media (min-width:768px){.container{width:970px}}@media (min-width:992px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:480px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:768px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:992px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#333}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#419ce3;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(65, 156, 227, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(65, 156, 227, 0.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px;line-height:1.42857143 \0}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:0}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:3px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:480px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:480px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:480px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:480px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#84bfed;border-color:#6eb3ea}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#58a8e6;border-color:#3898e2}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#84bfed;border-color:#6eb3ea}.btn-primary .badge{color:#84bfed;background-color:#fff}.btn-success{color:#fff;background-color:#975bfb;border-color:#8742fa}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#7729fa;border-color:#6106f9}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#975bfb;border-color:#8742fa}.btn-success .badge{color:#975bfb;background-color:#fff}.btn-info{color:#fff;background-color:#f2d890;border-color:#efd079}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#edc862;border-color:#e9bd42}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#f2d890;border-color:#efd079}.btn-info .badge{color:#f2d890;background-color:#fff}.btn-warning{color:#fff;background-color:#dda409;border-color:#c49208}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ac8007;border-color:#8a6606}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#dda409;border-color:#c49208}.btn-warning .badge{color:#dda409;background-color:#fff}.btn-danger{color:#fff;background-color:#e2592a;border-color:#d54c1d}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#bf441a;border-color:#a03916}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#e2592a;border-color:#d54c1d}.btn-danger .badge{color:#e2592a;background-color:#fff}.btn-link{color:#84bfed;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#419ce3;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:3px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:0}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{position:absolute;z-index:-1;opacity:0;filter:alpha(opacity=0)}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#84bfed}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:0 0 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:480px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:480px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:0 0 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#84bfed}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:480px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:480px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:0 0 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:0}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:320px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:480px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#84bfed;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#84bfed}.thumbnail .caption{padding:9px;color:#333}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#84bfed;border-color:#84bfed}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#fff}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:479px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:479px){.visible-xs-block{display:block !important}}@media (max-width:479px){.visible-xs-inline{display:inline !important}}@media (max-width:479px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:480px) and (max-width:767px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:480px) and (max-width:767px){.visible-sm-block{display:block !important}}@media (min-width:480px) and (max-width:767px){.visible-sm-inline{display:inline !important}}@media (min-width:480px) and (max-width:767px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-md-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-md-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:992px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:992px){.visible-lg-block{display:block !important}}@media (min-width:992px){.visible-lg-inline{display:inline !important}}@media (min-width:992px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:479px){.hidden-xs{display:none !important}}@media (min-width:480px) and (max-width:767px){.hidden-sm{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-md{display:none !important}}@media (min-width:992px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}} -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kadamwhite/expresspress/df9e5800ca053e495d6d90a60cb5e2bee739d1dd/public/favicon.ico -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kadamwhite/expresspress/df9e5800ca053e495d6d90a60cb5e2bee739d1dd/public/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kadamwhite/expresspress/df9e5800ca053e495d6d90a60cb5e2bee739d1dd/public/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kadamwhite/expresspress/df9e5800ca053e495d6d90a60cb5e2bee739d1dd/public/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /public/images/dark-sharp-edges.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kadamwhite/expresspress/df9e5800ca053e495d6d90a60cb5e2bee739d1dd/public/images/dark-sharp-edges.png -------------------------------------------------------------------------------- /public/js/sidebar.js: -------------------------------------------------------------------------------- 1 | (function( $ ) { 2 | 'use strict'; 3 | var $moreTags = $( '#more-tags' ); 4 | var $toggleTagsButton = $( '#toggle-all-tags' ); 5 | 6 | $toggleTagsButton.on( 'click', function( evt ) { 7 | $moreTags.slideToggle({ 8 | done: function() { 9 | // Once the animation is done, switch to class-based hiding 10 | // so that the lists line up better 11 | $moreTags 12 | .toggleClass( 'collapsed' ) 13 | .removeAttr( 'style' ); 14 | } 15 | }); 16 | // Flip label in the button 17 | $toggleTagsButton.find( 'span' ).toggleClass( 'hidden' ); 18 | }); 19 | })( jQuery ); 20 | -------------------------------------------------------------------------------- /public/stylus/mixins.styl: -------------------------------------------------------------------------------- 1 | $xs-screen = 320px; 2 | $sm-screen = 480px; 3 | $md-screen = 768px; 4 | $lg-screen = 992px; 5 | 6 | respond-below($width) 7 | media = 'all and (max-width: %s)' % $width 8 | @media media 9 | {block} 10 | 11 | 12 | respond-above($width) 13 | media = 'all and (min-width: %s)' % $width 14 | @media media 15 | {block} 16 | 17 | respond-between($min-width, $max-width) { 18 | $max-width = $max-width - 1; 19 | media = 'all and (min-width: %s) and (max-width: %s)' % ($min-width $max-width); 20 | @media media { 21 | {block} 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /public/stylus/style.styl: -------------------------------------------------------------------------------- 1 | // 3rd-party dependencies 2 | // -------------------------------------------------------- 3 | @import 'lib/bootstrap.min.css'; 4 | @import 'lib/bootstrap-theme.min.css'; 5 | 6 | // 1st-party dependencies, helpers & utilities 7 | // -------------------------------------------------------- 8 | @import 'mixins'; 9 | 10 | // Font and Image URLs 11 | // -------------------------------------------------------- 12 | $dark-bg-texture = '/images/dark-sharp-edges.png'; 13 | 14 | // ======================================================== 15 | // Global styles 16 | // -------------------------------------------------------- 17 | 18 | 19 | // See http://static.incompl.com/awful 20 | * { 21 | box-sizing: border-box; 22 | overflow: auto; 23 | } 24 | 25 | $frame-size-small = 10px; 26 | $frame-size-large = 20px; 27 | 28 | html { 29 | height: '-webkit-calc( 100% - %s )' % $frame-size-small; 30 | height: 'calc( 100% - %s )' % $frame-size-small; 31 | margin: $frame-size-small $frame-size-small 0; 32 | background: url($dark-bg-texture); 33 | 34 | +respond-above($sm-screen) { 35 | height: '-webkit-calc( 100% - %s )' % $frame-size-large; 36 | height: 'calc( 100% - %s )' % $frame-size-large; 37 | margin: $frame-size-large $frame-size-large 0; 38 | } 39 | } 40 | 41 | body { 42 | height: '-webkit-calc( 100% - %s )' % $frame-size-small; 43 | height: 'calc( 100% - %s )' % $frame-size-small; 44 | padding: $frame-size-small; 45 | +respond-above($sm-screen) { 46 | height: '-webkit-calc( 100% - %s )' % $frame-size-large; 47 | height: 'calc( 100% - %s )' % $frame-size-large; 48 | padding: $frame-size-large; 49 | } 50 | overflow-y: scroll; 51 | 52 | // Non-layout top-level rules 53 | background-color: white; 54 | word-wrap: break-word; 55 | } 56 | 57 | pre { 58 | max-width: 100%; 59 | overflow: scroll; 60 | } 61 | 62 | .container { 63 | max-width: 100%; 64 | } 65 | 66 | img { 67 | // insta-responsive! 68 | max-width: 100%; 69 | height: auto; 70 | } 71 | 72 | // Typography styles 73 | 74 | a:hover { 75 | text-decoration: none; 76 | } 77 | 78 | // Sidebar 79 | 80 | #sidebar { 81 | ul { 82 | padding: 0; 83 | } 84 | 85 | #sidebar-tags { 86 | ul { 87 | display: inline; 88 | } 89 | .collapsed { 90 | display: none; 91 | } 92 | } 93 | 94 | li { 95 | padding: 0; 96 | background-color: #84bfed; 97 | display: inline-block; 98 | 99 | &:hover { 100 | background-color: #419ce3; 101 | } 102 | } 103 | 104 | a { 105 | display: block; 106 | padding: 3px; 107 | margin-right: 5px; 108 | color: white; 109 | } 110 | 111 | .btn { 112 | display: block; 113 | } 114 | } 115 | 116 | // Hide functionality that presumes WP stylesheets are enabled 117 | .sharedaddy { 118 | display: none; 119 | } 120 | -------------------------------------------------------------------------------- /routes/category.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var wp = require( '../services/wp' ); 4 | var contentService = require( '../services/content-service' ); 5 | var pageNumbers = require( '../services/page-numbers' ); 6 | var pageTitle = require( '../services/page-title' ); 7 | var RSVP = require( 'rsvp' ); 8 | 9 | function getcategoryArchive( req, res, next ) { 10 | var categorySlug = req.params.category; 11 | var pages = pageNumbers( req.params.page ); 12 | var category = contentService.categoryCached( categorySlug ); 13 | 14 | RSVP.hash({ 15 | archiveBase: '/categorys/' + categorySlug, 16 | pages: pages, 17 | category: category, 18 | title: category.then(function( category ) { 19 | if ( ! category ) { return ''; } 20 | return pageTitle( 'Posts in "' + category.name + '"' ); 21 | }), 22 | // Primary page content 23 | posts: wp.posts().category( categorySlug ).page( pages.current ), 24 | sidebar: contentService.getSidebarContent() 25 | }).then(function( context ) { 26 | if ( req.params.page && ! context.posts.length ) { 27 | // Invalid archive page (no posts): 404 28 | return next(); 29 | } 30 | 31 | if ( ! context.category ) { 32 | // category not found: 404 33 | return next(); 34 | } 35 | 36 | return res.render( 'archive-category', context ); 37 | }).catch( next ); 38 | } 39 | 40 | module.exports = getcategoryArchive; 41 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var wp = require( '../services/wp' ); 4 | var contentService = require( '../services/content-service' ); 5 | var pageNumbers = require( '../services/page-numbers' ); 6 | var pageTitle = require( '../services/page-title' ); 7 | var RSVP = require( 'rsvp' ); 8 | 9 | function getHomepage( req, res, next ) { 10 | var pages = pageNumbers( req.params.page ); 11 | 12 | RSVP.hash({ 13 | archiveBase: '', 14 | pages: pages, 15 | title: pageTitle(), 16 | // Primary page content 17 | posts: wp.posts().page( pages.current ), 18 | sidebar: contentService.getSidebarContent() 19 | }).then(function( context ) { 20 | if ( req.params.page && ! context.posts.length ) { 21 | // Invalid pagination: 404 22 | return next(); 23 | } 24 | 25 | res.render( 'index', context ); 26 | }).catch( next ); 27 | } 28 | 29 | module.exports = getHomepage; 30 | -------------------------------------------------------------------------------- /routes/public-router.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var express = require( 'express' ); 4 | var router = express.Router(); 5 | var siteInfoMiddleware = require( '../middleware/site-info' ); 6 | 7 | // Set global site info on all routes 8 | router.use( siteInfoMiddleware ); 9 | 10 | // Public Routes 11 | // ============= 12 | 13 | router.get( '/', require( './index' ) ); 14 | router.get( '/page/:page', require( './index' ) ); 15 | // router.use( '/search', require( './search' ) ); 16 | // router.use( '/:year/:month', require( './archive-year-month' ) ); 17 | router.get( '/:year/:month/:slug', require( './single' ) ); 18 | router.use( '/tags/:tag', require( './tag' ) ); 19 | router.use( '/categories/:category', require( './category' ) ); 20 | 21 | // catch 404 and forward to error handler 22 | router.use(function( req, res, next ) { 23 | var err = new Error( 'Not Found' ); 24 | err.status = 404; 25 | next(err); 26 | }); 27 | 28 | // Error Handling 29 | // ============== 30 | 31 | // development error handler 32 | // will print stacktrace 33 | function developmentErrorRoute( err, req, res, next ) { 34 | res.status( err.status || 500 ); 35 | res.render( 'error', { 36 | message: err.message, 37 | error: err 38 | }); 39 | } 40 | 41 | // production error handler 42 | // no stacktraces leaked to user 43 | function friendlyErrorRoute( err, req, res, next ) { 44 | res.status( err.status || 500 ); 45 | res.render( 'error', { 46 | message: err.message, 47 | error: {} 48 | }); 49 | } 50 | 51 | // Configure error-handling behavior 52 | if ( router.get( 'env' ) === 'development' ) { 53 | router.use( developmentErrorRoute ); 54 | } else { 55 | router.use( friendlyErrorRoute ); 56 | } 57 | 58 | module.exports = router; 59 | -------------------------------------------------------------------------------- /routes/single.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var RSVP = require( 'rsvp' ); 4 | var _ = require( 'lodash' ); 5 | var wp = require( '../services/wp' ); 6 | var contentService = require( '../services/content-service' ); 7 | var pageTitle = require( '../services/page-title' ); 8 | 9 | function getSinglePost( req, res, next ) { 10 | var post = wp.posts().filter({ 11 | monthnum: req.params.month, 12 | year: req.params.year, 13 | name: req.params.slug 14 | }).then(function( posts ) { 15 | return _.first( posts ); 16 | }); 17 | 18 | RSVP.hash({ 19 | title: post.then(function( post ) { 20 | return pageTitle( post && post.title ); 21 | }), 22 | // Primary page content 23 | post: post, 24 | sidebar: contentService.getSidebarContent() 25 | }).then(function( context ) { 26 | if ( ! context.post ) { 27 | // No post found: 404 28 | return next(); 29 | } 30 | 31 | res.render( 'single', context ); 32 | }).catch( next ); 33 | } 34 | 35 | module.exports = getSinglePost; 36 | -------------------------------------------------------------------------------- /routes/tag.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var wp = require( '../services/wp' ); 4 | var contentService = require( '../services/content-service' ); 5 | var pageNumbers = require( '../services/page-numbers' ); 6 | var pageTitle = require( '../services/page-title' ); 7 | var RSVP = require( 'rsvp' ); 8 | 9 | function getTagArchive( req, res, next ) { 10 | var tagSlug = req.params.tag; 11 | var pages = pageNumbers( req.params.page ); 12 | var tag = contentService.tagCached( tagSlug ); 13 | 14 | RSVP.hash({ 15 | archiveBase: '/tags/' + tagSlug, 16 | pages: pages, 17 | tag: tag, 18 | title: tag.then(function( tag ) { 19 | if ( ! tag ) { return ''; } 20 | return pageTitle( 'Posts tagged "' + tag.name + '"' ); 21 | }), 22 | // Primary page content 23 | posts: wp.posts().tag( tagSlug ).page( pages.current ), 24 | sidebar: contentService.getSidebarContent() 25 | }).then(function( context ) { 26 | if ( req.params.page && ! context.posts.length ) { 27 | // Invalid archive page (no posts): 404 28 | return next(); 29 | } 30 | 31 | if ( ! context.tag ) { 32 | // Tag not found: 404 33 | return next(); 34 | } 35 | 36 | return res.render( 'archive-tag', context ); 37 | }).catch( next ); 38 | } 39 | 40 | module.exports = getTagArchive; 41 | -------------------------------------------------------------------------------- /routes/users.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var express = require( 'express' ); 4 | var router = express.Router(); 5 | 6 | router.get( '/', function( req, res ) { 7 | res.send( 'respond with a resource' ); 8 | }); 9 | 10 | module.exports = router; 11 | -------------------------------------------------------------------------------- /services/config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require( 'path' ); 4 | var yaml = require( 'js-yaml' ); 5 | var fs = require( 'fs' ); 6 | 7 | var config; 8 | 9 | var configPath = path.resolve( __dirname, '../config.yml' ); 10 | 11 | // Get document, or throw exception on error 12 | try { 13 | config = yaml.safeLoad( fs.readFileSync( configPath, 'utf8' ) ); 14 | } catch( err ) { 15 | console.error( err ); 16 | } 17 | 18 | module.exports = config; 19 | -------------------------------------------------------------------------------- /services/content-cache.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var config = require( './config' ); 4 | 5 | // Caching for common requests 6 | var LRU = require( 'lru-cache' ); 7 | 8 | var cache = LRU({ 9 | max: 50, 10 | maxAge: config.wordpress.cacheLimit 11 | }); 12 | 13 | module.exports = cache; 14 | -------------------------------------------------------------------------------- /services/content-service.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var wp = require( './wp' ); 4 | var cache = require( './content-cache' ); 5 | var _ = require( 'lodash' ); 6 | var RSVP = require( 'rsvp' ); 7 | 8 | /** 9 | * Recursively fetch all pages of a paged collection 10 | * 11 | * @param {Promise} request A promise to a WP API request's response 12 | * @returns {Array} A promise to an array of all matching records 13 | */ 14 | function all( request ) { 15 | return request.then(function( response ) { 16 | if ( ! response._paging || ! response._paging.next ) { 17 | return response; 18 | } 19 | // Request the next page and return both responses as one collection 20 | return RSVP.all([ 21 | response, 22 | all( response._paging.next ) 23 | ]).then(function( responses ) { 24 | return _.flatten( responses ); 25 | }); 26 | }); 27 | } 28 | 29 | function siteInfo( prop ) { 30 | var siteInfoPromise = cache.get( 'site-info' ); 31 | 32 | if ( ! siteInfoPromise ) { 33 | // Instantiate, request and cache the promise 34 | siteInfoPromise = wp.root( '/' ).then(function( info ) { 35 | return info; 36 | }); 37 | cache.set( 'site-info', siteInfoPromise ); 38 | } 39 | 40 | // Return the requested property 41 | return siteInfoPromise.then(function( info ) { 42 | return prop ? info[ prop ] : info; 43 | }); 44 | } 45 | 46 | /** 47 | * Get an alphabetized list of categories 48 | * 49 | * All archive routes display a sorted list of categories in their sidebar. 50 | * We generate that list here to ensure the sorting logic isn't duplicated 51 | * across routes. 52 | * 53 | * @method sortedCategories 54 | * @return {Array} An array of category objects 55 | */ 56 | function sortedCategories() { 57 | return all( wp.categories() ).then(function( categories ) { 58 | return _.chain( categories ) 59 | .sortBy( 'slug' ) 60 | .value(); 61 | }); 62 | } 63 | 64 | function sortedCategoriesCached() { 65 | var categoriesPromise = cache.get( 'sorted-categories' ); 66 | 67 | if ( ! categoriesPromise ) { 68 | categoriesPromise = sortedCategories(); 69 | cache.set( 'sorted-categories', categoriesPromise ); 70 | } 71 | 72 | return categoriesPromise; 73 | } 74 | 75 | /** 76 | * Get a specific category (specified by slug) from the content cache 77 | * 78 | * The WP API doesn't currently support filtering taxonomy term collections, 79 | * so we have to request all categories and filter them down if we want to get 80 | * an individual term. 81 | * 82 | * To make this request more efficient, it uses sortedCategoriesCached. 83 | * 84 | * @method categoryCached 85 | * @param {String} slug The slug of a category 86 | * @return {Promise} A promise to the category with the provided slug 87 | */ 88 | function categoryCached( slug ) { 89 | return sortedCategoriesCached().then(function( categories ) { 90 | return _.findWhere( categories, { 91 | slug: slug 92 | }); 93 | }); 94 | } 95 | 96 | /** 97 | * Get a specific tag (specified by slug) from the content cache 98 | * 99 | * The WP API doesn't currently support filtering taxonomy term collections, 100 | * so we have to request all tags and filter them down if we want to get an 101 | * individual term. 102 | * 103 | * To make this request more efficient, it uses the cached sortedTags promise. 104 | * 105 | * @method tagCached 106 | * @param {String} slug The slug of a tag 107 | * @return {Promise} A promise to the tag with the provided slug 108 | */ 109 | function tagCached( slug ) { 110 | return sortedTagsCached().then(function( tags ) { 111 | return _.findWhere( tags, { 112 | slug: slug 113 | }); 114 | }); 115 | } 116 | 117 | /** 118 | * Get an alphabetized list of tags 119 | * 120 | * @method sortedTags 121 | * @return {Array} An array of tag objects 122 | */ 123 | function sortedTags() { 124 | return all( wp.tags() ).then(function( tags ) { 125 | return _.chain( tags ) 126 | .sortBy( 'slug' ) 127 | .value(); 128 | }); 129 | } 130 | 131 | function sortedTagsCached() { 132 | var tagsPromise = cache.get( 'sorted-tags' ); 133 | 134 | if ( ! tagsPromise ) { 135 | tagsPromise = sortedTags(); 136 | cache.set( 'sorted-tags', tagsPromise ); 137 | } 138 | 139 | return tagsPromise; 140 | } 141 | 142 | function getSidebarContent() { 143 | return RSVP.hash({ 144 | categories: sortedCategoriesCached(), 145 | tags: sortedTagsCached() 146 | }); 147 | } 148 | 149 | module.exports = { 150 | // Recursively page through a collection to retrieve all matching items 151 | all: all, 152 | // Get (and cache) the top-level information about a site, returning the 153 | // value corresponding to the provided key 154 | siteInfo: siteInfo, 155 | sortedCategories: sortedCategories, 156 | sortedCategoriesCached: sortedCategoriesCached, 157 | categoryCached: categoryCached, 158 | tagCached: tagCached, 159 | sortedTags: sortedTags, 160 | sortedTagsCached: sortedTagsCached, 161 | getSidebarContent: getSidebarContent 162 | }; 163 | -------------------------------------------------------------------------------- /services/page-numbers.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | pageNumbers takes a integer (as a string), and returns an object containing 5 | the provided integer, the integer + 1, and the integer -1. This simplistic 6 | service gives us an object that can be passed to templates in conjunction with 7 | a paging object to construct "next" / "previous" buttons in the Library. 8 | 9 | @method pageNumbers 10 | @param current {Integer} The integer representing the current page number 11 | @return {String} An object with `current`, `prev` and `next` page numbers 12 | */ 13 | function pageNumbers( current ) { 14 | // Request params come through as strings: convert to integers 15 | // If "current" is undefined, assume we're on the first page 16 | current = parseInt( current || 1, 10 ); 17 | return { 18 | prev: current - 1, 19 | current: current, 20 | next: current + 1 21 | }; 22 | } 23 | 24 | module.exports = pageNumbers; 25 | -------------------------------------------------------------------------------- /services/page-title.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var contentService = require( './content-service' ); 4 | 5 | /** 6 | pageTitle takes any number of strings, and produces a formatted HTML title 7 | string in which the provided arguments are separated by | and followed by 8 | the site title. 9 | 10 | @method pageTitle 11 | @param titleComponent* {String} Value(s) to be included in the rendered title 12 | @return {Promise} A promise to a formatted title string 13 | */ 14 | function pageTitle() { 15 | var titleComponents = Array.prototype.slice.call( arguments ); 16 | var siteNameRequest = contentService.siteInfo( 'name' ); 17 | return siteNameRequest.then(function( siteName ) { 18 | return titleComponents 19 | .concat( siteName ) 20 | .join(' | '); 21 | }); 22 | } 23 | 24 | module.exports = pageTitle; 25 | -------------------------------------------------------------------------------- /services/wp.js: -------------------------------------------------------------------------------- 1 | var WP = require( 'wordpress-rest-api' ); 2 | var _ = require( 'lodash' ); 3 | 4 | var config = _.pick( require( './config' ).wordpress, [ 5 | // Whitelist valid config keys 6 | 'username', 7 | 'password', 8 | 'endpoint' 9 | ]); 10 | 11 | var wp = new WP( config ); 12 | 13 | module.exports = wp; 14 | -------------------------------------------------------------------------------- /views/archive-category.tmpl: -------------------------------------------------------------------------------- 1 | {%extend layouts/main as content%} 2 |
3 | {%partial partials/global-header . %} 4 | 5 |
6 |
7 |
8 |
9 |

10 | Posts in “{{{category.name}}}” 11 |

12 |
13 |
14 | 15 |
16 | {%each posts as post idx%} 17 | 18 | {%-- 19 | Every two items, make a new row 20 | --%} 21 | {%if idx|every 2 %} 22 |
23 |
24 | {%endif%} 25 | 26 |
27 |

28 | 29 | {{{post.title}}} 30 | 31 |

32 |

by {{post.author.name}}

33 | {%if post.excerpt%} 34 |

{{{post.excerpt}}}

35 | {%endif%} 36 |
{%-- .post --%} 37 | 38 | {%endeach%} 39 |
{%-- .row --%} 40 | 41 |
42 |
43 | {%partial partials/pagination . %} 44 |
45 |
{%-- .row --%} 46 | 47 |
{%-- .col-md-8 --%} 48 | 49 | {%-- .col-md-4 --%} 52 |
53 |
{%-- .container --%} 54 | 55 | {%partial partials/footer%} 56 | 57 | {%endextend%} 58 | -------------------------------------------------------------------------------- /views/archive-tag.tmpl: -------------------------------------------------------------------------------- 1 | {%extend layouts/main as content%} 2 |
3 | {%partial partials/global-header . %} 4 | 5 |
6 |
7 |
8 |
9 |

10 | Posts tagged “{{tag.name}}” 11 |

12 |
13 |
14 | 15 |
16 | {%each posts as post idx%} 17 | 18 | {%-- 19 | Every two items, make a new row 20 | --%} 21 | {%if idx|every 2 %} 22 |
23 |
24 | {%endif%} 25 | 26 |
27 |

28 | 29 | {{{post.title}}} 30 | 31 |

32 |

by {{post.author.name}}

33 | {%if post.excerpt%} 34 |

{{{post.excerpt}}}

35 | {%endif%} 36 |
{%-- .post --%} 37 | 38 | {%endeach%} 39 |
{%-- .row --%} 40 | 41 |
42 |
43 | {%partial partials/pagination . %} 44 |
45 |
{%-- .row --%} 46 | 47 |
{%-- .col-md-8 --%} 48 | 49 | {%-- .col-md-4 --%} 52 |
53 |
{%-- .container --%} 54 | 55 | {%partial partials/footer%} 56 | 57 | {%endextend%} 58 | -------------------------------------------------------------------------------- /views/error.tmpl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ title }} 5 | 6 | 7 | 8 |

9 | {{ message }} 10 | {{ error.status }} 11 |

12 | {%if error.stack %} 13 |
{{{ error.stack }}}
14 | {%endif%} 15 | 16 | 17 | -------------------------------------------------------------------------------- /views/filters/every.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function everyNItems( index, n, base ) { 4 | base = base || 0; 5 | return index >= base && (index - base) % n === 0; 6 | } 7 | 8 | module.exports = everyNItems; 9 | -------------------------------------------------------------------------------- /views/filters/format-date.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function formatDate( date ) { 4 | if ( ! date instanceof Date ) { 5 | date = new Date( date ); 6 | } 7 | return date.toString(); 8 | } 9 | 10 | module.exports = formatDate; 11 | -------------------------------------------------------------------------------- /views/filters/get-image.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _ = require( 'lodash' ); 4 | 5 | var validSizes = [ 6 | 'large', 7 | 'medium', 8 | 'thumbnail' 9 | ]; 10 | 11 | var validProps = [ 12 | 'url', 13 | 'width', 14 | 'height' 15 | ]; 16 | 17 | /** 18 | Get the banner image URL off a CMS post's featured_image object: it will 19 | return either the URL associated with the specified image crop (defaulting 20 | to "large"), or the URL for the original image itself. 21 | 22 | @param {Object} featuredImage The featured_image property of a post object 23 | @param {String} [size] The size of the image version to retrieve (one of 24 | "thumbnail", "medium" or "large") 25 | @param {String} [prop] A property name to return: "url", "width" or "height" 26 | @return {Object} An object with url, width & height parameters 27 | */ 28 | function getImageSize( featuredImage, size, prop ) { 29 | /*jshint -W106 */// Disable underscore_case warnings: WP uses them 30 | var image = {}; 31 | 32 | if ( ! featuredImage ) { 33 | // Bad arguments: return empty object 34 | return prop ? '' : image; 35 | } 36 | 37 | if ( ! size || ! _.contains( validSizes, size ) ) { 38 | // Default size to "large" 39 | size = 'large'; 40 | } 41 | 42 | var src = featuredImage.source; 43 | var meta = featuredImage.attachment_meta; 44 | 45 | if ( ! meta || ! src ) { 46 | // Malformed: return empty object 47 | return prop ? '' : image; 48 | } 49 | 50 | var sizes = meta.sizes; 51 | 52 | if ( sizes && sizes[ size ] ) { 53 | image = _.pick( sizes[ size ], [ 54 | 'url', 55 | 'width', 56 | 'height' 57 | ]); 58 | } else { 59 | image = { 60 | url: src, 61 | width: meta.width, 62 | height: meta.height 63 | }; 64 | } 65 | 66 | return prop && _.contains( validProps, prop ) ? 67 | image[ prop ] : 68 | image; 69 | } 70 | 71 | module.exports = getImageSize; 72 | -------------------------------------------------------------------------------- /views/filters/get-month.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function getMonthFromDate( date ) { 4 | if ( ! ( date instanceof Date ) ) { 5 | date = new Date( date ); 6 | } 7 | // getMonth is 0-indexed 8 | var month = date.getMonth() + 1; 9 | // Convert to a string and pad to two digits 10 | return ( month < 10 ? '0' : '' ) + month; 11 | } 12 | 13 | module.exports = getMonthFromDate; 14 | -------------------------------------------------------------------------------- /views/filters/get-year.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function getYearFromDate( date ) { 4 | if ( ! ( date instanceof Date ) ) { 5 | date = new Date( date ); 6 | } 7 | return date.getFullYear(); 8 | } 9 | 10 | module.exports = getYearFromDate; 11 | -------------------------------------------------------------------------------- /views/filters/remove-empty-taxonomies.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _ = require( 'lodash' ); 4 | 5 | function removeEmptyTags( collection ) { 6 | return _.filter( collection, function( term ) { 7 | return term.count > 0; 8 | }); 9 | } 10 | 11 | module.exports = removeEmptyTags; 12 | -------------------------------------------------------------------------------- /views/filters/sort-by.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _ = require( 'lodash' ); 4 | 5 | function sortByFilter( collection, prop ) { 6 | return _.sortBy( collection, prop ); 7 | } 8 | 9 | module.exports = sortByFilter; 10 | -------------------------------------------------------------------------------- /views/filters/stringify.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var format = require( 'cliff' ).inspect; 4 | var stripColorCodes = require( 'stripcolorcodes' ); 5 | 6 | function stringifyFilter( values ) { 7 | return stripColorCodes( format( values ) ); 8 | } 9 | 10 | module.exports = stringifyFilter; 11 | -------------------------------------------------------------------------------- /views/index.tmpl: -------------------------------------------------------------------------------- 1 | {%extend layouts/main as content%} 2 |
3 | {%partial partials/global-header . %} 4 | 5 |
6 |
7 |
8 | {%each posts as post idx%} 9 | 10 | {%-- 11 | Every two items, make a new row 12 | --%} 13 | {%if idx|every 2 %} 14 |
15 |
16 | {%endif%} 17 | 18 | {%-- 19 | First four posts are full-width: following posts are 1/2 width. 20 | All posts are 1/2 width when paging through past post archives. 21 | --%} 22 | {%if pages.current == 1 %} 23 |
24 | {%else%} 25 |
26 | {%endif%} 27 |

28 | 29 | {{{post.title}}} 30 | 31 |

32 |

by {{post.author.name}}

33 | {%if post.excerpt%} 34 |

{{{post.excerpt}}}

35 | {%endif%} 36 |
{%-- .post --%} 37 | 38 | {%endeach%} 39 |
{%-- .row --%} 40 |
41 |
42 | {%partial partials/pagination . %} 43 |
44 |
{%-- .row --%} 45 |
{%-- .col-md-8 --%} 46 | {%-- .col-md-4 --%} 49 |
50 |
{%-- .container --%} 51 | 52 | {%partial partials/footer%} 53 | 54 | {%endextend%} 55 | -------------------------------------------------------------------------------- /views/layouts/main.tmpl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{{ title }}} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | {%partial content%} 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /views/partials/footer.tmpl: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /views/partials/global-header.tmpl: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

5 | 6 | {{site.name}} 7 | 8 |

9 | 10 |

{{site.description}}

11 |
12 |
13 |
14 |
15 | -------------------------------------------------------------------------------- /views/partials/page-banner.tmpl: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /views/partials/pagination.tmpl: -------------------------------------------------------------------------------- 1 | {%if posts._paging %} 2 |
3 | 21 | {%endif%} 22 | -------------------------------------------------------------------------------- /views/partials/sidebar.tmpl: -------------------------------------------------------------------------------- 1 | {%if categories.length %} 2 | 14 | {%endif%} 15 | 16 | {%if tags.length %} 17 | 41 | {%endif%} 42 | {%endif%} 43 | -------------------------------------------------------------------------------- /views/single.tmpl: -------------------------------------------------------------------------------- 1 | {%extend layouts/main as content%} 2 |
3 | {%partial partials/global-header . %} 4 | 5 | {%if post.featured_image|get-image 'large' 'url'%} 6 |
7 |
8 | {%partial partials/page-banner post.featured_image|get-image %} 9 |
10 |
11 | {%endif%} 12 | 13 |
14 |
15 |

{{{post.title}}}

16 | 17 |

by {{post.author.name}}

18 | 19 |
20 | {{{post.content}}} 21 |
22 |
{%-- .col-md-8 --%} 23 | {%-- .col-md-4 --%} 26 |
{%-- .row --%} 27 |
28 | 29 | {%partial partials/footer%} 30 | 31 | {%endextend%} 32 | --------------------------------------------------------------------------------