├── README.md ├── fis-conf.js ├── fonts ├── FontAwesome.otf ├── fontawesome-webfont.eot ├── fontawesome-webfont.svg ├── fontawesome-webfont.ttf └── fontawesome-webfont.woff ├── html ├── jade │ ├── foo.jade │ └── jade.png └── markdown │ ├── foo.md │ └── markdown.jpg ├── index.html ├── script ├── coffeescript │ ├── chart_line.png │ ├── coffee.png │ └── foo.coffee └── js │ ├── cancel.png │ ├── handlebars.runtime-v1.3.0.js │ └── use-templates.js ├── style ├── css │ ├── coins.png │ ├── font-awesome.css │ ├── github.css │ └── markdown.css ├── less │ ├── _foo.less │ ├── chart_curve.png │ └── foo.less ├── sass │ ├── comment.png │ └── foo.sass ├── scss │ ├── _reset.scss │ ├── connect.png │ └── foo.scss └── stylus │ ├── compress.png │ └── foo.styl └── template ├── ejs └── foo.ejs └── handlebars └── foo.handlebars /README.md: -------------------------------------------------------------------------------- 1 | # 静态资源缓存控制编译工具 2 | 3 | 前不久在 [知乎](http://zhihu.com) 上回答了一个问题:[大公司里怎样开发和部署前端代码?](http://www.zhihu.com/question/20790576/answer/32602154)。其中讲到了大公司在前端静态资源部署上的一些要求: 4 | 5 | 1. 配置超长时间的本地缓存 —— 节省带宽,提高性能 6 | 1. 采用内容摘要作为缓存更新依据 —— 精确的缓存控制 7 | 1. 静态资源CDN部署 —— 优化网络请求 8 | 1. 更资源发布路径实现非覆盖式发布 —— 平滑升级 9 | 10 | 其中比较复杂的部分就是 ``以文件的摘要信息为依据,控制缓存更新与非覆盖式发布`` 这个细节。因此基于 [fis](http://fis.baidu.com) 包装了一个简单的命令行工具,并设立此项目,用于演示这部分功能。 11 | 12 | 这个工具基于 [fis](http://fis.baidu.com) 的小工具是完全可以用作工程中的,有任何问题可以在 [这里](https://github.com/fouber/blog/issues/5) 留言。 13 | 14 | 请跟着下面的步骤来使用这个命令行小工具: 15 | 16 | ## 第一步:安装工具 17 | 18 | 这个命令行小工具依赖 [nodejs](http://nodejs.org/) 环境,因此,请先确保本地安装了它。 19 | 20 | 使用 [nodejs](http://nodejs.org/) 随带的 [npm](https://www.npmjs.org/) 包管理工具进行安装: 21 | 22 | ```bash 23 | npm install -g rsd 24 | ``` 25 | 26 | ## 第二步:创建项目 27 | 28 | 在 ``命令行`` 下clone本仓库,或者自己创建一个新的项目,并进入: 29 | 30 | ```bash 31 | mkdir rsd-project # 项目名任意 32 | cd rsd-project 33 | ``` 34 | 35 | 在项目根目录下创建一个空的 ``fis-conf.js`` 文件,这是工具配置,什么都不用写,空着就行。 36 | 37 | 然后开始在项目目录下,随意创建或添加 页面、脚本、样式、图片、字体、音频、视频等等前端资源文件,正常写前端代码吧! 38 | 39 | ## 第三步:发布代码 40 | 41 | 在项目根目录下执行: 42 | 43 | ```bash 44 | rsd release --md5 --dest ../output 45 | ``` 46 | 47 | 然后去到 ``../output`` 目录下去查看一下产出结果吧,所有静态资源都以md5摘要形式发布了出来,所有资源链接,我说 **所有链接**,包括html中的图片、样式、脚本以及js中的资源地址、css中的资源地址全部都加上了md5戳。 48 | 49 | 上述命令中,``--md5`` 就是表示要给所有资源定位标记加上摘要信息的意思,不加这个参数就没有摘要信息处理。``--dest ../output`` 表示把代码发布到当前目录上一级的output目录中。整个这条命令还可以简写成: 50 | 51 | ```bash 52 | rsd release -m -d ../output 53 | ``` 54 | 55 | 或者进一步连写成: 56 | 57 | ```bash 58 | rsd release -md ../output 59 | ``` 60 | 61 | ## 在本地服务器中浏览发布代码 62 | 63 | 你本地安装了诸如 Apache、Nginx、Lighttpd、IIS等服务器么?如果安装了,假设你的服务器 ``根目录`` 在 d:\\wwwroot,你可以利用rsd工具的release命令,把代码发布过去,比如: 64 | 65 | ```bash 66 | rsd release -md d:\wwwroot 67 | ``` 68 | 69 | 这样就把代码发布到了本地服务器根目录下,然后就可以在浏览器中查看效果了! 70 | 71 | 如果你本地没有安装任何服务器,你可以使用rsd内置的调试服务器,执行命令: 72 | 73 | ```bash 74 | rsd server start 75 | ``` 76 | 77 | 接下来我们同样要把代码发布到这个内置服务器中,release命令如果省略 ``--dest ``参数,就表示把代码发布到内置服务器的根目录下: 78 | 79 | ```bash 80 | rsd release -m 81 | ``` 82 | 83 | 在浏览器中访问: http://localhost:8080 即可 84 | 85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 | 97 | ## 一些小技巧 98 | 99 | 1. rsd集成了对很多前端编程语言的支持,包括: 100 | * 类CSS语言:[less](http://www.lesscss.net/), [sass](http://sass-lang.com/), [scss](http://sass-lang.com/), [stylus](http://learnboost.github.io/stylus/) 101 | * 类JS语言:[coffee-script](http://coffeescript.org/) 102 | * 类HTML语言:[markdown](http://zh.wikipedia.org/wiki/Markdown), [jade](http://jade-lang.com/) 103 | * 前端模板:[handlebars-v1.3.0](http://handlebarsjs.com/), [EJS](http://www.embeddedjs.com/) 104 | 1. 内置了压缩器,在release的时候追加 ``-o`` 或者 ``--optimize`` 参数即可开启,压缩器包括: 105 | * [clean-css](https://github.com/jakubpawlowicz/clean-css): 压缩所有类CSS语言代码 106 | * [uglify-js](http://lisperator.net/uglifyjs/): 压缩所有类JS语言代码 107 | * [html-minifier](http://kangax.github.io/html-minifier/): 压缩所有类HTML语言代码 108 | 1. 还可以给资源加CDN域名,在release的时候追加 ``-D`` 或者 ``--domains`` 参数即可,域名配置写在fis-conf.js里: 109 | 110 | ```javascript 111 | // fis-conf.js 112 | fis.config.set('roadmap.domain', [ 'http://localhost:8080' ]); 113 | ``` 114 | 115 | 1. 所有常规代码中的资源定位接口都会经过工具处理,包括: 116 | * 类CSS文件中: 117 | * 背景图url 118 | * font-face字体url 119 | * ie特有的滤镜属性中的src 120 | * 类JS文件中: 121 | * 提供了一个叫 ``__uri('path/to/file')`` 的编译函数用于定位资源 122 | * 类HTML文件中: 123 | * link标签的href属性 124 | * script, img, video, audio, object 等标签的src属性 125 | * script标签中js代码里的资源定位标记 126 | * style标签中css代码里的资源定位标记 127 | 1. 所有资源文件可以任意相互引用,工具会处理资源定位标记,使之服从知乎回答中提到的优化策略。 128 | 1. 还提供了资源内嵌的编译接口,用于把一个资源的内容以文本、字符串或者base64的形式嵌入到 ``任意`` 一个文本文件中。 129 | 1. 为了不用每次保存代码就执行一下release命令,工具中提供了文件监听和浏览器自动刷新功能,只要在release的时候在追加上 ``-w`` 和 ``-L`` 两个参数即可(注意L的大小写),比如: 130 | 131 | ```bash 132 | rsd release -omwL #压缩、加md5戳、文件监听、浏览器自动刷新 133 | ``` 134 | 135 | ## 关于这个小工具 136 | 137 | 它的原码在 [这里](https://github.com/fouber/static-resource-digest)。是的,就这么一点点代码,花了大概半小时写完的,因为一切都在 [fis](http://fis.baidu.com) 中集成好了,我只是追加几个语言编译插件而已。 138 | -------------------------------------------------------------------------------- /fis-conf.js: -------------------------------------------------------------------------------- 1 | // CDN域名配置 2 | fis.config.set('roadmap.domain', [ 'http://localhost:8080' ]); -------------------------------------------------------------------------------- /fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fouber/static-resource-digest-project/69d94d0a43801003ad8732f5bab009d8bdee5b3b/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fouber/static-resource-digest-project/69d94d0a43801003ad8732f5bab009d8bdee5b3b/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fouber/static-resource-digest-project/69d94d0a43801003ad8732f5bab009d8bdee5b3b/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fouber/static-resource-digest-project/69d94d0a43801003ad8732f5bab009d8bdee5b3b/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /html/jade/foo.jade: -------------------------------------------------------------------------------- 1 | hr 2 | div 3 | blockquote 以下内容来自 4 | code html/jade/foo.jade 5 | div(style="background:#00a86b") 6 | img(src="jade.png") 7 | h1 Jade - node template engine 8 | #container.col 9 | if youAreUsingJade 10 | p You are amazing 11 | else 12 | p Get on it! 13 | p. 14 | Jade is a terse and simple 15 | templating language with a 16 | strong focus on performance 17 | and powerful features. -------------------------------------------------------------------------------- /html/jade/jade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fouber/static-resource-digest-project/69d94d0a43801003ad8732f5bab009d8bdee5b3b/html/jade/jade.png -------------------------------------------------------------------------------- /html/markdown/foo.md: -------------------------------------------------------------------------------- 1 | -------- 2 | 3 | > 以下内容来自 ``html/markdown/foo.md`` 文件 4 | 5 | # 这是 H1 # 6 | 7 | ## 这是 H2 ## 8 | 9 | ### 这是 H3 ###### 10 | 11 | ![一个图片](markdown.jpg) 12 | 13 | * 呵呵 14 | * 哈哈 -------------------------------------------------------------------------------- /html/markdown/markdown.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fouber/static-resource-digest-project/69d94d0a43801003ad8732f5bab009d8bdee5b3b/html/markdown/markdown.jpg -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 静态资源缓存控制 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /script/coffeescript/chart_line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fouber/static-resource-digest-project/69d94d0a43801003ad8732f5bab009d8bdee5b3b/script/coffeescript/chart_line.png -------------------------------------------------------------------------------- /script/coffeescript/coffee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fouber/static-resource-digest-project/69d94d0a43801003ad8732f5bab009d8bdee5b3b/script/coffeescript/coffee.png -------------------------------------------------------------------------------- /script/coffeescript/foo.coffee: -------------------------------------------------------------------------------- 1 | # @see http://coffeescript.org/ 2 | 3 | # Assignment: 4 | number = 42 5 | opposite = true 6 | 7 | # Conditions: 8 | number = -42 if opposite 9 | 10 | # Functions: 11 | square = (x) -> x * x 12 | 13 | # Arrays: 14 | list = [1, 2, 3, 4, 5] 15 | 16 | # Objects: 17 | math = 18 | root: Math.sqrt 19 | square: square 20 | cube: (x) -> x * square x 21 | 22 | # Splats: 23 | race = (winner, runners...) -> 24 | print winner, runners 25 | 26 | # Existence: 27 | alert "I knew it!" if elvis? 28 | 29 | # Array comprehensions: 30 | cubes = (math.cube num for num in list) 31 | 32 | console.log '' 33 | console.log '=============================' 34 | console.log '= /script/coffee/foo.coffee =' 35 | console.log '=============================' 36 | console.log '' 37 | 38 | console.log cubes 39 | 40 | # resource location 41 | console.log '' 42 | console.log 'locate resource in coffee:', __uri 'coffee.png' 43 | 44 | # use handlebars 45 | 46 | tpl = __inline '/template/handlebars/foo.handlebars' 47 | data = 48 | title: 'coffee use handlebars' 49 | body: 'It works!' 50 | html = tpl data 51 | console.log '' 52 | console.log 'use handlebars from coffee: ' 53 | console.log html 54 | 55 | # use ejs 56 | 57 | tpl = __inline '/template/ejs/foo.ejs' 58 | data = 59 | supplies: [ 'in coffee', 'EJS works!' ] 60 | html = tpl data 61 | console.log '' 62 | console.log 'use handlebars from coffee: ' 63 | console.log html -------------------------------------------------------------------------------- /script/js/cancel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fouber/static-resource-digest-project/69d94d0a43801003ad8732f5bab009d8bdee5b3b/script/js/cancel.png -------------------------------------------------------------------------------- /script/js/handlebars.runtime-v1.3.0.js: -------------------------------------------------------------------------------- 1 | /*! 2 | 3 | handlebars v1.3.0 4 | 5 | Copyright (C) 2011 by Yehuda Katz 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in 15 | all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | THE SOFTWARE. 24 | 25 | @license 26 | */ 27 | /* exported Handlebars */ 28 | var Handlebars = (function() { 29 | // handlebars/safe-string.js 30 | var __module3__ = (function() { 31 | "use strict"; 32 | var __exports__; 33 | // Build out our basic SafeString type 34 | function SafeString(string) { 35 | this.string = string; 36 | } 37 | 38 | SafeString.prototype.toString = function() { 39 | return "" + this.string; 40 | }; 41 | 42 | __exports__ = SafeString; 43 | return __exports__; 44 | })(); 45 | 46 | // handlebars/utils.js 47 | var __module2__ = (function(__dependency1__) { 48 | "use strict"; 49 | var __exports__ = {}; 50 | /*jshint -W004 */ 51 | var SafeString = __dependency1__; 52 | 53 | var escape = { 54 | "&": "&", 55 | "<": "<", 56 | ">": ">", 57 | '"': """, 58 | "'": "'", 59 | "`": "`" 60 | }; 61 | 62 | var badChars = /[&<>"'`]/g; 63 | var possible = /[&<>"'`]/; 64 | 65 | function escapeChar(chr) { 66 | return escape[chr] || "&"; 67 | } 68 | 69 | function extend(obj, value) { 70 | for(var key in value) { 71 | if(Object.prototype.hasOwnProperty.call(value, key)) { 72 | obj[key] = value[key]; 73 | } 74 | } 75 | } 76 | 77 | __exports__.extend = extend;var toString = Object.prototype.toString; 78 | __exports__.toString = toString; 79 | // Sourced from lodash 80 | // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt 81 | var isFunction = function(value) { 82 | return typeof value === 'function'; 83 | }; 84 | // fallback for older versions of Chrome and Safari 85 | if (isFunction(/x/)) { 86 | isFunction = function(value) { 87 | return typeof value === 'function' && toString.call(value) === '[object Function]'; 88 | }; 89 | } 90 | var isFunction; 91 | __exports__.isFunction = isFunction; 92 | var isArray = Array.isArray || function(value) { 93 | return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false; 94 | }; 95 | __exports__.isArray = isArray; 96 | 97 | function escapeExpression(string) { 98 | // don't escape SafeStrings, since they're already safe 99 | if (string instanceof SafeString) { 100 | return string.toString(); 101 | } else if (!string && string !== 0) { 102 | return ""; 103 | } 104 | 105 | // Force a string conversion as this will be done by the append regardless and 106 | // the regex test will do this transparently behind the scenes, causing issues if 107 | // an object's to string has escaped characters in it. 108 | string = "" + string; 109 | 110 | if(!possible.test(string)) { return string; } 111 | return string.replace(badChars, escapeChar); 112 | } 113 | 114 | __exports__.escapeExpression = escapeExpression;function isEmpty(value) { 115 | if (!value && value !== 0) { 116 | return true; 117 | } else if (isArray(value) && value.length === 0) { 118 | return true; 119 | } else { 120 | return false; 121 | } 122 | } 123 | 124 | __exports__.isEmpty = isEmpty; 125 | return __exports__; 126 | })(__module3__); 127 | 128 | // handlebars/exception.js 129 | var __module4__ = (function() { 130 | "use strict"; 131 | var __exports__; 132 | 133 | var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; 134 | 135 | function Exception(message, node) { 136 | var line; 137 | if (node && node.firstLine) { 138 | line = node.firstLine; 139 | 140 | message += ' - ' + line + ':' + node.firstColumn; 141 | } 142 | 143 | var tmp = Error.prototype.constructor.call(this, message); 144 | 145 | // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. 146 | for (var idx = 0; idx < errorProps.length; idx++) { 147 | this[errorProps[idx]] = tmp[errorProps[idx]]; 148 | } 149 | 150 | if (line) { 151 | this.lineNumber = line; 152 | this.column = node.firstColumn; 153 | } 154 | } 155 | 156 | Exception.prototype = new Error(); 157 | 158 | __exports__ = Exception; 159 | return __exports__; 160 | })(); 161 | 162 | // handlebars/base.js 163 | var __module1__ = (function(__dependency1__, __dependency2__) { 164 | "use strict"; 165 | var __exports__ = {}; 166 | var Utils = __dependency1__; 167 | var Exception = __dependency2__; 168 | 169 | var VERSION = "1.3.0"; 170 | __exports__.VERSION = VERSION;var COMPILER_REVISION = 4; 171 | __exports__.COMPILER_REVISION = COMPILER_REVISION; 172 | var REVISION_CHANGES = { 173 | 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it 174 | 2: '== 1.0.0-rc.3', 175 | 3: '== 1.0.0-rc.4', 176 | 4: '>= 1.0.0' 177 | }; 178 | __exports__.REVISION_CHANGES = REVISION_CHANGES; 179 | var isArray = Utils.isArray, 180 | isFunction = Utils.isFunction, 181 | toString = Utils.toString, 182 | objectType = '[object Object]'; 183 | 184 | function HandlebarsEnvironment(helpers, partials) { 185 | this.helpers = helpers || {}; 186 | this.partials = partials || {}; 187 | 188 | registerDefaultHelpers(this); 189 | } 190 | 191 | __exports__.HandlebarsEnvironment = HandlebarsEnvironment;HandlebarsEnvironment.prototype = { 192 | constructor: HandlebarsEnvironment, 193 | 194 | logger: logger, 195 | log: log, 196 | 197 | registerHelper: function(name, fn, inverse) { 198 | if (toString.call(name) === objectType) { 199 | if (inverse || fn) { throw new Exception('Arg not supported with multiple helpers'); } 200 | Utils.extend(this.helpers, name); 201 | } else { 202 | if (inverse) { fn.not = inverse; } 203 | this.helpers[name] = fn; 204 | } 205 | }, 206 | 207 | registerPartial: function(name, str) { 208 | if (toString.call(name) === objectType) { 209 | Utils.extend(this.partials, name); 210 | } else { 211 | this.partials[name] = str; 212 | } 213 | } 214 | }; 215 | 216 | function registerDefaultHelpers(instance) { 217 | instance.registerHelper('helperMissing', function(arg) { 218 | if(arguments.length === 2) { 219 | return undefined; 220 | } else { 221 | throw new Exception("Missing helper: '" + arg + "'"); 222 | } 223 | }); 224 | 225 | instance.registerHelper('blockHelperMissing', function(context, options) { 226 | var inverse = options.inverse || function() {}, fn = options.fn; 227 | 228 | if (isFunction(context)) { context = context.call(this); } 229 | 230 | if(context === true) { 231 | return fn(this); 232 | } else if(context === false || context == null) { 233 | return inverse(this); 234 | } else if (isArray(context)) { 235 | if(context.length > 0) { 236 | return instance.helpers.each(context, options); 237 | } else { 238 | return inverse(this); 239 | } 240 | } else { 241 | return fn(context); 242 | } 243 | }); 244 | 245 | instance.registerHelper('each', function(context, options) { 246 | var fn = options.fn, inverse = options.inverse; 247 | var i = 0, ret = "", data; 248 | 249 | if (isFunction(context)) { context = context.call(this); } 250 | 251 | if (options.data) { 252 | data = createFrame(options.data); 253 | } 254 | 255 | if(context && typeof context === 'object') { 256 | if (isArray(context)) { 257 | for(var j = context.length; i li { 53 | position: relative; 54 | } 55 | .fa-li { 56 | position: absolute; 57 | left: -2.14285714em; 58 | width: 2.14285714em; 59 | top: 0.14285714em; 60 | text-align: center; 61 | } 62 | .fa-li.fa-lg { 63 | left: -1.85714286em; 64 | } 65 | .fa-border { 66 | padding: .2em .25em .15em; 67 | border: solid 0.08em #eeeeee; 68 | border-radius: .1em; 69 | } 70 | .pull-right { 71 | float: right; 72 | } 73 | .pull-left { 74 | float: left; 75 | } 76 | .fa.pull-left { 77 | margin-right: .3em; 78 | } 79 | .fa.pull-right { 80 | margin-left: .3em; 81 | } 82 | .fa-spin { 83 | -webkit-animation: fa-spin 2s infinite linear; 84 | animation: fa-spin 2s infinite linear; 85 | } 86 | @-webkit-keyframes fa-spin { 87 | 0% { 88 | -webkit-transform: rotate(0deg); 89 | transform: rotate(0deg); 90 | } 91 | 100% { 92 | -webkit-transform: rotate(359deg); 93 | transform: rotate(359deg); 94 | } 95 | } 96 | @keyframes fa-spin { 97 | 0% { 98 | -webkit-transform: rotate(0deg); 99 | transform: rotate(0deg); 100 | } 101 | 100% { 102 | -webkit-transform: rotate(359deg); 103 | transform: rotate(359deg); 104 | } 105 | } 106 | .fa-rotate-90 { 107 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); 108 | -webkit-transform: rotate(90deg); 109 | -ms-transform: rotate(90deg); 110 | transform: rotate(90deg); 111 | } 112 | .fa-rotate-180 { 113 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); 114 | -webkit-transform: rotate(180deg); 115 | -ms-transform: rotate(180deg); 116 | transform: rotate(180deg); 117 | } 118 | .fa-rotate-270 { 119 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); 120 | -webkit-transform: rotate(270deg); 121 | -ms-transform: rotate(270deg); 122 | transform: rotate(270deg); 123 | } 124 | .fa-flip-horizontal { 125 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); 126 | -webkit-transform: scale(-1, 1); 127 | -ms-transform: scale(-1, 1); 128 | transform: scale(-1, 1); 129 | } 130 | .fa-flip-vertical { 131 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); 132 | -webkit-transform: scale(1, -1); 133 | -ms-transform: scale(1, -1); 134 | transform: scale(1, -1); 135 | } 136 | :root .fa-rotate-90, 137 | :root .fa-rotate-180, 138 | :root .fa-rotate-270, 139 | :root .fa-flip-horizontal, 140 | :root .fa-flip-vertical { 141 | filter: none; 142 | } 143 | .fa-stack { 144 | position: relative; 145 | display: inline-block; 146 | width: 2em; 147 | height: 2em; 148 | line-height: 2em; 149 | vertical-align: middle; 150 | } 151 | .fa-stack-1x, 152 | .fa-stack-2x { 153 | position: absolute; 154 | left: 0; 155 | width: 100%; 156 | text-align: center; 157 | } 158 | .fa-stack-1x { 159 | line-height: inherit; 160 | } 161 | .fa-stack-2x { 162 | font-size: 2em; 163 | } 164 | .fa-inverse { 165 | color: #ffffff; 166 | } 167 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen 168 | readers do not read off random characters that represent icons */ 169 | .fa-glass:before { 170 | content: "\f000"; 171 | } 172 | .fa-music:before { 173 | content: "\f001"; 174 | } 175 | .fa-search:before { 176 | content: "\f002"; 177 | } 178 | .fa-envelope-o:before { 179 | content: "\f003"; 180 | } 181 | .fa-heart:before { 182 | content: "\f004"; 183 | } 184 | .fa-star:before { 185 | content: "\f005"; 186 | } 187 | .fa-star-o:before { 188 | content: "\f006"; 189 | } 190 | .fa-user:before { 191 | content: "\f007"; 192 | } 193 | .fa-film:before { 194 | content: "\f008"; 195 | } 196 | .fa-th-large:before { 197 | content: "\f009"; 198 | } 199 | .fa-th:before { 200 | content: "\f00a"; 201 | } 202 | .fa-th-list:before { 203 | content: "\f00b"; 204 | } 205 | .fa-check:before { 206 | content: "\f00c"; 207 | } 208 | .fa-remove:before, 209 | .fa-close:before, 210 | .fa-times:before { 211 | content: "\f00d"; 212 | } 213 | .fa-search-plus:before { 214 | content: "\f00e"; 215 | } 216 | .fa-search-minus:before { 217 | content: "\f010"; 218 | } 219 | .fa-power-off:before { 220 | content: "\f011"; 221 | } 222 | .fa-signal:before { 223 | content: "\f012"; 224 | } 225 | .fa-gear:before, 226 | .fa-cog:before { 227 | content: "\f013"; 228 | } 229 | .fa-trash-o:before { 230 | content: "\f014"; 231 | } 232 | .fa-home:before { 233 | content: "\f015"; 234 | } 235 | .fa-file-o:before { 236 | content: "\f016"; 237 | } 238 | .fa-clock-o:before { 239 | content: "\f017"; 240 | } 241 | .fa-road:before { 242 | content: "\f018"; 243 | } 244 | .fa-download:before { 245 | content: "\f019"; 246 | } 247 | .fa-arrow-circle-o-down:before { 248 | content: "\f01a"; 249 | } 250 | .fa-arrow-circle-o-up:before { 251 | content: "\f01b"; 252 | } 253 | .fa-inbox:before { 254 | content: "\f01c"; 255 | } 256 | .fa-play-circle-o:before { 257 | content: "\f01d"; 258 | } 259 | .fa-rotate-right:before, 260 | .fa-repeat:before { 261 | content: "\f01e"; 262 | } 263 | .fa-refresh:before { 264 | content: "\f021"; 265 | } 266 | .fa-list-alt:before { 267 | content: "\f022"; 268 | } 269 | .fa-lock:before { 270 | content: "\f023"; 271 | } 272 | .fa-flag:before { 273 | content: "\f024"; 274 | } 275 | .fa-headphones:before { 276 | content: "\f025"; 277 | } 278 | .fa-volume-off:before { 279 | content: "\f026"; 280 | } 281 | .fa-volume-down:before { 282 | content: "\f027"; 283 | } 284 | .fa-volume-up:before { 285 | content: "\f028"; 286 | } 287 | .fa-qrcode:before { 288 | content: "\f029"; 289 | } 290 | .fa-barcode:before { 291 | content: "\f02a"; 292 | } 293 | .fa-tag:before { 294 | content: "\f02b"; 295 | } 296 | .fa-tags:before { 297 | content: "\f02c"; 298 | } 299 | .fa-book:before { 300 | content: "\f02d"; 301 | } 302 | .fa-bookmark:before { 303 | content: "\f02e"; 304 | } 305 | .fa-print:before { 306 | content: "\f02f"; 307 | } 308 | .fa-camera:before { 309 | content: "\f030"; 310 | } 311 | .fa-font:before { 312 | content: "\f031"; 313 | } 314 | .fa-bold:before { 315 | content: "\f032"; 316 | } 317 | .fa-italic:before { 318 | content: "\f033"; 319 | } 320 | .fa-text-height:before { 321 | content: "\f034"; 322 | } 323 | .fa-text-width:before { 324 | content: "\f035"; 325 | } 326 | .fa-align-left:before { 327 | content: "\f036"; 328 | } 329 | .fa-align-center:before { 330 | content: "\f037"; 331 | } 332 | .fa-align-right:before { 333 | content: "\f038"; 334 | } 335 | .fa-align-justify:before { 336 | content: "\f039"; 337 | } 338 | .fa-list:before { 339 | content: "\f03a"; 340 | } 341 | .fa-dedent:before, 342 | .fa-outdent:before { 343 | content: "\f03b"; 344 | } 345 | .fa-indent:before { 346 | content: "\f03c"; 347 | } 348 | .fa-video-camera:before { 349 | content: "\f03d"; 350 | } 351 | .fa-photo:before, 352 | .fa-image:before, 353 | .fa-picture-o:before { 354 | content: "\f03e"; 355 | } 356 | .fa-pencil:before { 357 | content: "\f040"; 358 | } 359 | .fa-map-marker:before { 360 | content: "\f041"; 361 | } 362 | .fa-adjust:before { 363 | content: "\f042"; 364 | } 365 | .fa-tint:before { 366 | content: "\f043"; 367 | } 368 | .fa-edit:before, 369 | .fa-pencil-square-o:before { 370 | content: "\f044"; 371 | } 372 | .fa-share-square-o:before { 373 | content: "\f045"; 374 | } 375 | .fa-check-square-o:before { 376 | content: "\f046"; 377 | } 378 | .fa-arrows:before { 379 | content: "\f047"; 380 | } 381 | .fa-step-backward:before { 382 | content: "\f048"; 383 | } 384 | .fa-fast-backward:before { 385 | content: "\f049"; 386 | } 387 | .fa-backward:before { 388 | content: "\f04a"; 389 | } 390 | .fa-play:before { 391 | content: "\f04b"; 392 | } 393 | .fa-pause:before { 394 | content: "\f04c"; 395 | } 396 | .fa-stop:before { 397 | content: "\f04d"; 398 | } 399 | .fa-forward:before { 400 | content: "\f04e"; 401 | } 402 | .fa-fast-forward:before { 403 | content: "\f050"; 404 | } 405 | .fa-step-forward:before { 406 | content: "\f051"; 407 | } 408 | .fa-eject:before { 409 | content: "\f052"; 410 | } 411 | .fa-chevron-left:before { 412 | content: "\f053"; 413 | } 414 | .fa-chevron-right:before { 415 | content: "\f054"; 416 | } 417 | .fa-plus-circle:before { 418 | content: "\f055"; 419 | } 420 | .fa-minus-circle:before { 421 | content: "\f056"; 422 | } 423 | .fa-times-circle:before { 424 | content: "\f057"; 425 | } 426 | .fa-check-circle:before { 427 | content: "\f058"; 428 | } 429 | .fa-question-circle:before { 430 | content: "\f059"; 431 | } 432 | .fa-info-circle:before { 433 | content: "\f05a"; 434 | } 435 | .fa-crosshairs:before { 436 | content: "\f05b"; 437 | } 438 | .fa-times-circle-o:before { 439 | content: "\f05c"; 440 | } 441 | .fa-check-circle-o:before { 442 | content: "\f05d"; 443 | } 444 | .fa-ban:before { 445 | content: "\f05e"; 446 | } 447 | .fa-arrow-left:before { 448 | content: "\f060"; 449 | } 450 | .fa-arrow-right:before { 451 | content: "\f061"; 452 | } 453 | .fa-arrow-up:before { 454 | content: "\f062"; 455 | } 456 | .fa-arrow-down:before { 457 | content: "\f063"; 458 | } 459 | .fa-mail-forward:before, 460 | .fa-share:before { 461 | content: "\f064"; 462 | } 463 | .fa-expand:before { 464 | content: "\f065"; 465 | } 466 | .fa-compress:before { 467 | content: "\f066"; 468 | } 469 | .fa-plus:before { 470 | content: "\f067"; 471 | } 472 | .fa-minus:before { 473 | content: "\f068"; 474 | } 475 | .fa-asterisk:before { 476 | content: "\f069"; 477 | } 478 | .fa-exclamation-circle:before { 479 | content: "\f06a"; 480 | } 481 | .fa-gift:before { 482 | content: "\f06b"; 483 | } 484 | .fa-leaf:before { 485 | content: "\f06c"; 486 | } 487 | .fa-fire:before { 488 | content: "\f06d"; 489 | } 490 | .fa-eye:before { 491 | content: "\f06e"; 492 | } 493 | .fa-eye-slash:before { 494 | content: "\f070"; 495 | } 496 | .fa-warning:before, 497 | .fa-exclamation-triangle:before { 498 | content: "\f071"; 499 | } 500 | .fa-plane:before { 501 | content: "\f072"; 502 | } 503 | .fa-calendar:before { 504 | content: "\f073"; 505 | } 506 | .fa-random:before { 507 | content: "\f074"; 508 | } 509 | .fa-comment:before { 510 | content: "\f075"; 511 | } 512 | .fa-magnet:before { 513 | content: "\f076"; 514 | } 515 | .fa-chevron-up:before { 516 | content: "\f077"; 517 | } 518 | .fa-chevron-down:before { 519 | content: "\f078"; 520 | } 521 | .fa-retweet:before { 522 | content: "\f079"; 523 | } 524 | .fa-shopping-cart:before { 525 | content: "\f07a"; 526 | } 527 | .fa-folder:before { 528 | content: "\f07b"; 529 | } 530 | .fa-folder-open:before { 531 | content: "\f07c"; 532 | } 533 | .fa-arrows-v:before { 534 | content: "\f07d"; 535 | } 536 | .fa-arrows-h:before { 537 | content: "\f07e"; 538 | } 539 | .fa-bar-chart-o:before, 540 | .fa-bar-chart:before { 541 | content: "\f080"; 542 | } 543 | .fa-twitter-square:before { 544 | content: "\f081"; 545 | } 546 | .fa-facebook-square:before { 547 | content: "\f082"; 548 | } 549 | .fa-camera-retro:before { 550 | content: "\f083"; 551 | } 552 | .fa-key:before { 553 | content: "\f084"; 554 | } 555 | .fa-gears:before, 556 | .fa-cogs:before { 557 | content: "\f085"; 558 | } 559 | .fa-comments:before { 560 | content: "\f086"; 561 | } 562 | .fa-thumbs-o-up:before { 563 | content: "\f087"; 564 | } 565 | .fa-thumbs-o-down:before { 566 | content: "\f088"; 567 | } 568 | .fa-star-half:before { 569 | content: "\f089"; 570 | } 571 | .fa-heart-o:before { 572 | content: "\f08a"; 573 | } 574 | .fa-sign-out:before { 575 | content: "\f08b"; 576 | } 577 | .fa-linkedin-square:before { 578 | content: "\f08c"; 579 | } 580 | .fa-thumb-tack:before { 581 | content: "\f08d"; 582 | } 583 | .fa-external-link:before { 584 | content: "\f08e"; 585 | } 586 | .fa-sign-in:before { 587 | content: "\f090"; 588 | } 589 | .fa-trophy:before { 590 | content: "\f091"; 591 | } 592 | .fa-github-square:before { 593 | content: "\f092"; 594 | } 595 | .fa-upload:before { 596 | content: "\f093"; 597 | } 598 | .fa-lemon-o:before { 599 | content: "\f094"; 600 | } 601 | .fa-phone:before { 602 | content: "\f095"; 603 | } 604 | .fa-square-o:before { 605 | content: "\f096"; 606 | } 607 | .fa-bookmark-o:before { 608 | content: "\f097"; 609 | } 610 | .fa-phone-square:before { 611 | content: "\f098"; 612 | } 613 | .fa-twitter:before { 614 | content: "\f099"; 615 | } 616 | .fa-facebook:before { 617 | content: "\f09a"; 618 | } 619 | .fa-github:before { 620 | content: "\f09b"; 621 | } 622 | .fa-unlock:before { 623 | content: "\f09c"; 624 | } 625 | .fa-credit-card:before { 626 | content: "\f09d"; 627 | } 628 | .fa-rss:before { 629 | content: "\f09e"; 630 | } 631 | .fa-hdd-o:before { 632 | content: "\f0a0"; 633 | } 634 | .fa-bullhorn:before { 635 | content: "\f0a1"; 636 | } 637 | .fa-bell:before { 638 | content: "\f0f3"; 639 | } 640 | .fa-certificate:before { 641 | content: "\f0a3"; 642 | } 643 | .fa-hand-o-right:before { 644 | content: "\f0a4"; 645 | } 646 | .fa-hand-o-left:before { 647 | content: "\f0a5"; 648 | } 649 | .fa-hand-o-up:before { 650 | content: "\f0a6"; 651 | } 652 | .fa-hand-o-down:before { 653 | content: "\f0a7"; 654 | } 655 | .fa-arrow-circle-left:before { 656 | content: "\f0a8"; 657 | } 658 | .fa-arrow-circle-right:before { 659 | content: "\f0a9"; 660 | } 661 | .fa-arrow-circle-up:before { 662 | content: "\f0aa"; 663 | } 664 | .fa-arrow-circle-down:before { 665 | content: "\f0ab"; 666 | } 667 | .fa-globe:before { 668 | content: "\f0ac"; 669 | } 670 | .fa-wrench:before { 671 | content: "\f0ad"; 672 | } 673 | .fa-tasks:before { 674 | content: "\f0ae"; 675 | } 676 | .fa-filter:before { 677 | content: "\f0b0"; 678 | } 679 | .fa-briefcase:before { 680 | content: "\f0b1"; 681 | } 682 | .fa-arrows-alt:before { 683 | content: "\f0b2"; 684 | } 685 | .fa-group:before, 686 | .fa-users:before { 687 | content: "\f0c0"; 688 | } 689 | .fa-chain:before, 690 | .fa-link:before { 691 | content: "\f0c1"; 692 | } 693 | .fa-cloud:before { 694 | content: "\f0c2"; 695 | } 696 | .fa-flask:before { 697 | content: "\f0c3"; 698 | } 699 | .fa-cut:before, 700 | .fa-scissors:before { 701 | content: "\f0c4"; 702 | } 703 | .fa-copy:before, 704 | .fa-files-o:before { 705 | content: "\f0c5"; 706 | } 707 | .fa-paperclip:before { 708 | content: "\f0c6"; 709 | } 710 | .fa-save:before, 711 | .fa-floppy-o:before { 712 | content: "\f0c7"; 713 | } 714 | .fa-square:before { 715 | content: "\f0c8"; 716 | } 717 | .fa-navicon:before, 718 | .fa-reorder:before, 719 | .fa-bars:before { 720 | content: "\f0c9"; 721 | } 722 | .fa-list-ul:before { 723 | content: "\f0ca"; 724 | } 725 | .fa-list-ol:before { 726 | content: "\f0cb"; 727 | } 728 | .fa-strikethrough:before { 729 | content: "\f0cc"; 730 | } 731 | .fa-underline:before { 732 | content: "\f0cd"; 733 | } 734 | .fa-table:before { 735 | content: "\f0ce"; 736 | } 737 | .fa-magic:before { 738 | content: "\f0d0"; 739 | } 740 | .fa-truck:before { 741 | content: "\f0d1"; 742 | } 743 | .fa-pinterest:before { 744 | content: "\f0d2"; 745 | } 746 | .fa-pinterest-square:before { 747 | content: "\f0d3"; 748 | } 749 | .fa-google-plus-square:before { 750 | content: "\f0d4"; 751 | } 752 | .fa-google-plus:before { 753 | content: "\f0d5"; 754 | } 755 | .fa-money:before { 756 | content: "\f0d6"; 757 | } 758 | .fa-caret-down:before { 759 | content: "\f0d7"; 760 | } 761 | .fa-caret-up:before { 762 | content: "\f0d8"; 763 | } 764 | .fa-caret-left:before { 765 | content: "\f0d9"; 766 | } 767 | .fa-caret-right:before { 768 | content: "\f0da"; 769 | } 770 | .fa-columns:before { 771 | content: "\f0db"; 772 | } 773 | .fa-unsorted:before, 774 | .fa-sort:before { 775 | content: "\f0dc"; 776 | } 777 | .fa-sort-down:before, 778 | .fa-sort-desc:before { 779 | content: "\f0dd"; 780 | } 781 | .fa-sort-up:before, 782 | .fa-sort-asc:before { 783 | content: "\f0de"; 784 | } 785 | .fa-envelope:before { 786 | content: "\f0e0"; 787 | } 788 | .fa-linkedin:before { 789 | content: "\f0e1"; 790 | } 791 | .fa-rotate-left:before, 792 | .fa-undo:before { 793 | content: "\f0e2"; 794 | } 795 | .fa-legal:before, 796 | .fa-gavel:before { 797 | content: "\f0e3"; 798 | } 799 | .fa-dashboard:before, 800 | .fa-tachometer:before { 801 | content: "\f0e4"; 802 | } 803 | .fa-comment-o:before { 804 | content: "\f0e5"; 805 | } 806 | .fa-comments-o:before { 807 | content: "\f0e6"; 808 | } 809 | .fa-flash:before, 810 | .fa-bolt:before { 811 | content: "\f0e7"; 812 | } 813 | .fa-sitemap:before { 814 | content: "\f0e8"; 815 | } 816 | .fa-umbrella:before { 817 | content: "\f0e9"; 818 | } 819 | .fa-paste:before, 820 | .fa-clipboard:before { 821 | content: "\f0ea"; 822 | } 823 | .fa-lightbulb-o:before { 824 | content: "\f0eb"; 825 | } 826 | .fa-exchange:before { 827 | content: "\f0ec"; 828 | } 829 | .fa-cloud-download:before { 830 | content: "\f0ed"; 831 | } 832 | .fa-cloud-upload:before { 833 | content: "\f0ee"; 834 | } 835 | .fa-user-md:before { 836 | content: "\f0f0"; 837 | } 838 | .fa-stethoscope:before { 839 | content: "\f0f1"; 840 | } 841 | .fa-suitcase:before { 842 | content: "\f0f2"; 843 | } 844 | .fa-bell-o:before { 845 | content: "\f0a2"; 846 | } 847 | .fa-coffee:before { 848 | content: "\f0f4"; 849 | } 850 | .fa-cutlery:before { 851 | content: "\f0f5"; 852 | } 853 | .fa-file-text-o:before { 854 | content: "\f0f6"; 855 | } 856 | .fa-building-o:before { 857 | content: "\f0f7"; 858 | } 859 | .fa-hospital-o:before { 860 | content: "\f0f8"; 861 | } 862 | .fa-ambulance:before { 863 | content: "\f0f9"; 864 | } 865 | .fa-medkit:before { 866 | content: "\f0fa"; 867 | } 868 | .fa-fighter-jet:before { 869 | content: "\f0fb"; 870 | } 871 | .fa-beer:before { 872 | content: "\f0fc"; 873 | } 874 | .fa-h-square:before { 875 | content: "\f0fd"; 876 | } 877 | .fa-plus-square:before { 878 | content: "\f0fe"; 879 | } 880 | .fa-angle-double-left:before { 881 | content: "\f100"; 882 | } 883 | .fa-angle-double-right:before { 884 | content: "\f101"; 885 | } 886 | .fa-angle-double-up:before { 887 | content: "\f102"; 888 | } 889 | .fa-angle-double-down:before { 890 | content: "\f103"; 891 | } 892 | .fa-angle-left:before { 893 | content: "\f104"; 894 | } 895 | .fa-angle-right:before { 896 | content: "\f105"; 897 | } 898 | .fa-angle-up:before { 899 | content: "\f106"; 900 | } 901 | .fa-angle-down:before { 902 | content: "\f107"; 903 | } 904 | .fa-desktop:before { 905 | content: "\f108"; 906 | } 907 | .fa-laptop:before { 908 | content: "\f109"; 909 | } 910 | .fa-tablet:before { 911 | content: "\f10a"; 912 | } 913 | .fa-mobile-phone:before, 914 | .fa-mobile:before { 915 | content: "\f10b"; 916 | } 917 | .fa-circle-o:before { 918 | content: "\f10c"; 919 | } 920 | .fa-quote-left:before { 921 | content: "\f10d"; 922 | } 923 | .fa-quote-right:before { 924 | content: "\f10e"; 925 | } 926 | .fa-spinner:before { 927 | content: "\f110"; 928 | } 929 | .fa-circle:before { 930 | content: "\f111"; 931 | } 932 | .fa-mail-reply:before, 933 | .fa-reply:before { 934 | content: "\f112"; 935 | } 936 | .fa-github-alt:before { 937 | content: "\f113"; 938 | } 939 | .fa-folder-o:before { 940 | content: "\f114"; 941 | } 942 | .fa-folder-open-o:before { 943 | content: "\f115"; 944 | } 945 | .fa-smile-o:before { 946 | content: "\f118"; 947 | } 948 | .fa-frown-o:before { 949 | content: "\f119"; 950 | } 951 | .fa-meh-o:before { 952 | content: "\f11a"; 953 | } 954 | .fa-gamepad:before { 955 | content: "\f11b"; 956 | } 957 | .fa-keyboard-o:before { 958 | content: "\f11c"; 959 | } 960 | .fa-flag-o:before { 961 | content: "\f11d"; 962 | } 963 | .fa-flag-checkered:before { 964 | content: "\f11e"; 965 | } 966 | .fa-terminal:before { 967 | content: "\f120"; 968 | } 969 | .fa-code:before { 970 | content: "\f121"; 971 | } 972 | .fa-mail-reply-all:before, 973 | .fa-reply-all:before { 974 | content: "\f122"; 975 | } 976 | .fa-star-half-empty:before, 977 | .fa-star-half-full:before, 978 | .fa-star-half-o:before { 979 | content: "\f123"; 980 | } 981 | .fa-location-arrow:before { 982 | content: "\f124"; 983 | } 984 | .fa-crop:before { 985 | content: "\f125"; 986 | } 987 | .fa-code-fork:before { 988 | content: "\f126"; 989 | } 990 | .fa-unlink:before, 991 | .fa-chain-broken:before { 992 | content: "\f127"; 993 | } 994 | .fa-question:before { 995 | content: "\f128"; 996 | } 997 | .fa-info:before { 998 | content: "\f129"; 999 | } 1000 | .fa-exclamation:before { 1001 | content: "\f12a"; 1002 | } 1003 | .fa-superscript:before { 1004 | content: "\f12b"; 1005 | } 1006 | .fa-subscript:before { 1007 | content: "\f12c"; 1008 | } 1009 | .fa-eraser:before { 1010 | content: "\f12d"; 1011 | } 1012 | .fa-puzzle-piece:before { 1013 | content: "\f12e"; 1014 | } 1015 | .fa-microphone:before { 1016 | content: "\f130"; 1017 | } 1018 | .fa-microphone-slash:before { 1019 | content: "\f131"; 1020 | } 1021 | .fa-shield:before { 1022 | content: "\f132"; 1023 | } 1024 | .fa-calendar-o:before { 1025 | content: "\f133"; 1026 | } 1027 | .fa-fire-extinguisher:before { 1028 | content: "\f134"; 1029 | } 1030 | .fa-rocket:before { 1031 | content: "\f135"; 1032 | } 1033 | .fa-maxcdn:before { 1034 | content: "\f136"; 1035 | } 1036 | .fa-chevron-circle-left:before { 1037 | content: "\f137"; 1038 | } 1039 | .fa-chevron-circle-right:before { 1040 | content: "\f138"; 1041 | } 1042 | .fa-chevron-circle-up:before { 1043 | content: "\f139"; 1044 | } 1045 | .fa-chevron-circle-down:before { 1046 | content: "\f13a"; 1047 | } 1048 | .fa-html5:before { 1049 | content: "\f13b"; 1050 | } 1051 | .fa-css3:before { 1052 | content: "\f13c"; 1053 | } 1054 | .fa-anchor:before { 1055 | content: "\f13d"; 1056 | } 1057 | .fa-unlock-alt:before { 1058 | content: "\f13e"; 1059 | } 1060 | .fa-bullseye:before { 1061 | content: "\f140"; 1062 | } 1063 | .fa-ellipsis-h:before { 1064 | content: "\f141"; 1065 | } 1066 | .fa-ellipsis-v:before { 1067 | content: "\f142"; 1068 | } 1069 | .fa-rss-square:before { 1070 | content: "\f143"; 1071 | } 1072 | .fa-play-circle:before { 1073 | content: "\f144"; 1074 | } 1075 | .fa-ticket:before { 1076 | content: "\f145"; 1077 | } 1078 | .fa-minus-square:before { 1079 | content: "\f146"; 1080 | } 1081 | .fa-minus-square-o:before { 1082 | content: "\f147"; 1083 | } 1084 | .fa-level-up:before { 1085 | content: "\f148"; 1086 | } 1087 | .fa-level-down:before { 1088 | content: "\f149"; 1089 | } 1090 | .fa-check-square:before { 1091 | content: "\f14a"; 1092 | } 1093 | .fa-pencil-square:before { 1094 | content: "\f14b"; 1095 | } 1096 | .fa-external-link-square:before { 1097 | content: "\f14c"; 1098 | } 1099 | .fa-share-square:before { 1100 | content: "\f14d"; 1101 | } 1102 | .fa-compass:before { 1103 | content: "\f14e"; 1104 | } 1105 | .fa-toggle-down:before, 1106 | .fa-caret-square-o-down:before { 1107 | content: "\f150"; 1108 | } 1109 | .fa-toggle-up:before, 1110 | .fa-caret-square-o-up:before { 1111 | content: "\f151"; 1112 | } 1113 | .fa-toggle-right:before, 1114 | .fa-caret-square-o-right:before { 1115 | content: "\f152"; 1116 | } 1117 | .fa-euro:before, 1118 | .fa-eur:before { 1119 | content: "\f153"; 1120 | } 1121 | .fa-gbp:before { 1122 | content: "\f154"; 1123 | } 1124 | .fa-dollar:before, 1125 | .fa-usd:before { 1126 | content: "\f155"; 1127 | } 1128 | .fa-rupee:before, 1129 | .fa-inr:before { 1130 | content: "\f156"; 1131 | } 1132 | .fa-cny:before, 1133 | .fa-rmb:before, 1134 | .fa-yen:before, 1135 | .fa-jpy:before { 1136 | content: "\f157"; 1137 | } 1138 | .fa-ruble:before, 1139 | .fa-rouble:before, 1140 | .fa-rub:before { 1141 | content: "\f158"; 1142 | } 1143 | .fa-won:before, 1144 | .fa-krw:before { 1145 | content: "\f159"; 1146 | } 1147 | .fa-bitcoin:before, 1148 | .fa-btc:before { 1149 | content: "\f15a"; 1150 | } 1151 | .fa-file:before { 1152 | content: "\f15b"; 1153 | } 1154 | .fa-file-text:before { 1155 | content: "\f15c"; 1156 | } 1157 | .fa-sort-alpha-asc:before { 1158 | content: "\f15d"; 1159 | } 1160 | .fa-sort-alpha-desc:before { 1161 | content: "\f15e"; 1162 | } 1163 | .fa-sort-amount-asc:before { 1164 | content: "\f160"; 1165 | } 1166 | .fa-sort-amount-desc:before { 1167 | content: "\f161"; 1168 | } 1169 | .fa-sort-numeric-asc:before { 1170 | content: "\f162"; 1171 | } 1172 | .fa-sort-numeric-desc:before { 1173 | content: "\f163"; 1174 | } 1175 | .fa-thumbs-up:before { 1176 | content: "\f164"; 1177 | } 1178 | .fa-thumbs-down:before { 1179 | content: "\f165"; 1180 | } 1181 | .fa-youtube-square:before { 1182 | content: "\f166"; 1183 | } 1184 | .fa-youtube:before { 1185 | content: "\f167"; 1186 | } 1187 | .fa-xing:before { 1188 | content: "\f168"; 1189 | } 1190 | .fa-xing-square:before { 1191 | content: "\f169"; 1192 | } 1193 | .fa-youtube-play:before { 1194 | content: "\f16a"; 1195 | } 1196 | .fa-dropbox:before { 1197 | content: "\f16b"; 1198 | } 1199 | .fa-stack-overflow:before { 1200 | content: "\f16c"; 1201 | } 1202 | .fa-instagram:before { 1203 | content: "\f16d"; 1204 | } 1205 | .fa-flickr:before { 1206 | content: "\f16e"; 1207 | } 1208 | .fa-adn:before { 1209 | content: "\f170"; 1210 | } 1211 | .fa-bitbucket:before { 1212 | content: "\f171"; 1213 | } 1214 | .fa-bitbucket-square:before { 1215 | content: "\f172"; 1216 | } 1217 | .fa-tumblr:before { 1218 | content: "\f173"; 1219 | } 1220 | .fa-tumblr-square:before { 1221 | content: "\f174"; 1222 | } 1223 | .fa-long-arrow-down:before { 1224 | content: "\f175"; 1225 | } 1226 | .fa-long-arrow-up:before { 1227 | content: "\f176"; 1228 | } 1229 | .fa-long-arrow-left:before { 1230 | content: "\f177"; 1231 | } 1232 | .fa-long-arrow-right:before { 1233 | content: "\f178"; 1234 | } 1235 | .fa-apple:before { 1236 | content: "\f179"; 1237 | } 1238 | .fa-windows:before { 1239 | content: "\f17a"; 1240 | } 1241 | .fa-android:before { 1242 | content: "\f17b"; 1243 | } 1244 | .fa-linux:before { 1245 | content: "\f17c"; 1246 | } 1247 | .fa-dribbble:before { 1248 | content: "\f17d"; 1249 | } 1250 | .fa-skype:before { 1251 | content: "\f17e"; 1252 | } 1253 | .fa-foursquare:before { 1254 | content: "\f180"; 1255 | } 1256 | .fa-trello:before { 1257 | content: "\f181"; 1258 | } 1259 | .fa-female:before { 1260 | content: "\f182"; 1261 | } 1262 | .fa-male:before { 1263 | content: "\f183"; 1264 | } 1265 | .fa-gittip:before { 1266 | content: "\f184"; 1267 | } 1268 | .fa-sun-o:before { 1269 | content: "\f185"; 1270 | } 1271 | .fa-moon-o:before { 1272 | content: "\f186"; 1273 | } 1274 | .fa-archive:before { 1275 | content: "\f187"; 1276 | } 1277 | .fa-bug:before { 1278 | content: "\f188"; 1279 | } 1280 | .fa-vk:before { 1281 | content: "\f189"; 1282 | } 1283 | .fa-weibo:before { 1284 | content: "\f18a"; 1285 | } 1286 | .fa-renren:before { 1287 | content: "\f18b"; 1288 | } 1289 | .fa-pagelines:before { 1290 | content: "\f18c"; 1291 | } 1292 | .fa-stack-exchange:before { 1293 | content: "\f18d"; 1294 | } 1295 | .fa-arrow-circle-o-right:before { 1296 | content: "\f18e"; 1297 | } 1298 | .fa-arrow-circle-o-left:before { 1299 | content: "\f190"; 1300 | } 1301 | .fa-toggle-left:before, 1302 | .fa-caret-square-o-left:before { 1303 | content: "\f191"; 1304 | } 1305 | .fa-dot-circle-o:before { 1306 | content: "\f192"; 1307 | } 1308 | .fa-wheelchair:before { 1309 | content: "\f193"; 1310 | } 1311 | .fa-vimeo-square:before { 1312 | content: "\f194"; 1313 | } 1314 | .fa-turkish-lira:before, 1315 | .fa-try:before { 1316 | content: "\f195"; 1317 | } 1318 | .fa-plus-square-o:before { 1319 | content: "\f196"; 1320 | } 1321 | .fa-space-shuttle:before { 1322 | content: "\f197"; 1323 | } 1324 | .fa-slack:before { 1325 | content: "\f198"; 1326 | } 1327 | .fa-envelope-square:before { 1328 | content: "\f199"; 1329 | } 1330 | .fa-wordpress:before { 1331 | content: "\f19a"; 1332 | } 1333 | .fa-openid:before { 1334 | content: "\f19b"; 1335 | } 1336 | .fa-institution:before, 1337 | .fa-bank:before, 1338 | .fa-university:before { 1339 | content: "\f19c"; 1340 | } 1341 | .fa-mortar-board:before, 1342 | .fa-graduation-cap:before { 1343 | content: "\f19d"; 1344 | } 1345 | .fa-yahoo:before { 1346 | content: "\f19e"; 1347 | } 1348 | .fa-google:before { 1349 | content: "\f1a0"; 1350 | } 1351 | .fa-reddit:before { 1352 | content: "\f1a1"; 1353 | } 1354 | .fa-reddit-square:before { 1355 | content: "\f1a2"; 1356 | } 1357 | .fa-stumbleupon-circle:before { 1358 | content: "\f1a3"; 1359 | } 1360 | .fa-stumbleupon:before { 1361 | content: "\f1a4"; 1362 | } 1363 | .fa-delicious:before { 1364 | content: "\f1a5"; 1365 | } 1366 | .fa-digg:before { 1367 | content: "\f1a6"; 1368 | } 1369 | .fa-pied-piper:before { 1370 | content: "\f1a7"; 1371 | } 1372 | .fa-pied-piper-alt:before { 1373 | content: "\f1a8"; 1374 | } 1375 | .fa-drupal:before { 1376 | content: "\f1a9"; 1377 | } 1378 | .fa-joomla:before { 1379 | content: "\f1aa"; 1380 | } 1381 | .fa-language:before { 1382 | content: "\f1ab"; 1383 | } 1384 | .fa-fax:before { 1385 | content: "\f1ac"; 1386 | } 1387 | .fa-building:before { 1388 | content: "\f1ad"; 1389 | } 1390 | .fa-child:before { 1391 | content: "\f1ae"; 1392 | } 1393 | .fa-paw:before { 1394 | content: "\f1b0"; 1395 | } 1396 | .fa-spoon:before { 1397 | content: "\f1b1"; 1398 | } 1399 | .fa-cube:before { 1400 | content: "\f1b2"; 1401 | } 1402 | .fa-cubes:before { 1403 | content: "\f1b3"; 1404 | } 1405 | .fa-behance:before { 1406 | content: "\f1b4"; 1407 | } 1408 | .fa-behance-square:before { 1409 | content: "\f1b5"; 1410 | } 1411 | .fa-steam:before { 1412 | content: "\f1b6"; 1413 | } 1414 | .fa-steam-square:before { 1415 | content: "\f1b7"; 1416 | } 1417 | .fa-recycle:before { 1418 | content: "\f1b8"; 1419 | } 1420 | .fa-automobile:before, 1421 | .fa-car:before { 1422 | content: "\f1b9"; 1423 | } 1424 | .fa-cab:before, 1425 | .fa-taxi:before { 1426 | content: "\f1ba"; 1427 | } 1428 | .fa-tree:before { 1429 | content: "\f1bb"; 1430 | } 1431 | .fa-spotify:before { 1432 | content: "\f1bc"; 1433 | } 1434 | .fa-deviantart:before { 1435 | content: "\f1bd"; 1436 | } 1437 | .fa-soundcloud:before { 1438 | content: "\f1be"; 1439 | } 1440 | .fa-database:before { 1441 | content: "\f1c0"; 1442 | } 1443 | .fa-file-pdf-o:before { 1444 | content: "\f1c1"; 1445 | } 1446 | .fa-file-word-o:before { 1447 | content: "\f1c2"; 1448 | } 1449 | .fa-file-excel-o:before { 1450 | content: "\f1c3"; 1451 | } 1452 | .fa-file-powerpoint-o:before { 1453 | content: "\f1c4"; 1454 | } 1455 | .fa-file-photo-o:before, 1456 | .fa-file-picture-o:before, 1457 | .fa-file-image-o:before { 1458 | content: "\f1c5"; 1459 | } 1460 | .fa-file-zip-o:before, 1461 | .fa-file-archive-o:before { 1462 | content: "\f1c6"; 1463 | } 1464 | .fa-file-sound-o:before, 1465 | .fa-file-audio-o:before { 1466 | content: "\f1c7"; 1467 | } 1468 | .fa-file-movie-o:before, 1469 | .fa-file-video-o:before { 1470 | content: "\f1c8"; 1471 | } 1472 | .fa-file-code-o:before { 1473 | content: "\f1c9"; 1474 | } 1475 | .fa-vine:before { 1476 | content: "\f1ca"; 1477 | } 1478 | .fa-codepen:before { 1479 | content: "\f1cb"; 1480 | } 1481 | .fa-jsfiddle:before { 1482 | content: "\f1cc"; 1483 | } 1484 | .fa-life-bouy:before, 1485 | .fa-life-buoy:before, 1486 | .fa-life-saver:before, 1487 | .fa-support:before, 1488 | .fa-life-ring:before { 1489 | content: "\f1cd"; 1490 | } 1491 | .fa-circle-o-notch:before { 1492 | content: "\f1ce"; 1493 | } 1494 | .fa-ra:before, 1495 | .fa-rebel:before { 1496 | content: "\f1d0"; 1497 | } 1498 | .fa-ge:before, 1499 | .fa-empire:before { 1500 | content: "\f1d1"; 1501 | } 1502 | .fa-git-square:before { 1503 | content: "\f1d2"; 1504 | } 1505 | .fa-git:before { 1506 | content: "\f1d3"; 1507 | } 1508 | .fa-hacker-news:before { 1509 | content: "\f1d4"; 1510 | } 1511 | .fa-tencent-weibo:before { 1512 | content: "\f1d5"; 1513 | } 1514 | .fa-qq:before { 1515 | content: "\f1d6"; 1516 | } 1517 | .fa-wechat:before, 1518 | .fa-weixin:before { 1519 | content: "\f1d7"; 1520 | } 1521 | .fa-send:before, 1522 | .fa-paper-plane:before { 1523 | content: "\f1d8"; 1524 | } 1525 | .fa-send-o:before, 1526 | .fa-paper-plane-o:before { 1527 | content: "\f1d9"; 1528 | } 1529 | .fa-history:before { 1530 | content: "\f1da"; 1531 | } 1532 | .fa-circle-thin:before { 1533 | content: "\f1db"; 1534 | } 1535 | .fa-header:before { 1536 | content: "\f1dc"; 1537 | } 1538 | .fa-paragraph:before { 1539 | content: "\f1dd"; 1540 | } 1541 | .fa-sliders:before { 1542 | content: "\f1de"; 1543 | } 1544 | .fa-share-alt:before { 1545 | content: "\f1e0"; 1546 | } 1547 | .fa-share-alt-square:before { 1548 | content: "\f1e1"; 1549 | } 1550 | .fa-bomb:before { 1551 | content: "\f1e2"; 1552 | } 1553 | .fa-soccer-ball-o:before, 1554 | .fa-futbol-o:before { 1555 | content: "\f1e3"; 1556 | } 1557 | .fa-tty:before { 1558 | content: "\f1e4"; 1559 | } 1560 | .fa-binoculars:before { 1561 | content: "\f1e5"; 1562 | } 1563 | .fa-plug:before { 1564 | content: "\f1e6"; 1565 | } 1566 | .fa-slideshare:before { 1567 | content: "\f1e7"; 1568 | } 1569 | .fa-twitch:before { 1570 | content: "\f1e8"; 1571 | } 1572 | .fa-yelp:before { 1573 | content: "\f1e9"; 1574 | } 1575 | .fa-newspaper-o:before { 1576 | content: "\f1ea"; 1577 | } 1578 | .fa-wifi:before { 1579 | content: "\f1eb"; 1580 | } 1581 | .fa-calculator:before { 1582 | content: "\f1ec"; 1583 | } 1584 | .fa-paypal:before { 1585 | content: "\f1ed"; 1586 | } 1587 | .fa-google-wallet:before { 1588 | content: "\f1ee"; 1589 | } 1590 | .fa-cc-visa:before { 1591 | content: "\f1f0"; 1592 | } 1593 | .fa-cc-mastercard:before { 1594 | content: "\f1f1"; 1595 | } 1596 | .fa-cc-discover:before { 1597 | content: "\f1f2"; 1598 | } 1599 | .fa-cc-amex:before { 1600 | content: "\f1f3"; 1601 | } 1602 | .fa-cc-paypal:before { 1603 | content: "\f1f4"; 1604 | } 1605 | .fa-cc-stripe:before { 1606 | content: "\f1f5"; 1607 | } 1608 | .fa-bell-slash:before { 1609 | content: "\f1f6"; 1610 | } 1611 | .fa-bell-slash-o:before { 1612 | content: "\f1f7"; 1613 | } 1614 | .fa-trash:before { 1615 | content: "\f1f8"; 1616 | } 1617 | .fa-copyright:before { 1618 | content: "\f1f9"; 1619 | } 1620 | .fa-at:before { 1621 | content: "\f1fa"; 1622 | } 1623 | .fa-eyedropper:before { 1624 | content: "\f1fb"; 1625 | } 1626 | .fa-paint-brush:before { 1627 | content: "\f1fc"; 1628 | } 1629 | .fa-birthday-cake:before { 1630 | content: "\f1fd"; 1631 | } 1632 | .fa-area-chart:before { 1633 | content: "\f1fe"; 1634 | } 1635 | .fa-pie-chart:before { 1636 | content: "\f200"; 1637 | } 1638 | .fa-line-chart:before { 1639 | content: "\f201"; 1640 | } 1641 | .fa-lastfm:before { 1642 | content: "\f202"; 1643 | } 1644 | .fa-lastfm-square:before { 1645 | content: "\f203"; 1646 | } 1647 | .fa-toggle-off:before { 1648 | content: "\f204"; 1649 | } 1650 | .fa-toggle-on:before { 1651 | content: "\f205"; 1652 | } 1653 | .fa-bicycle:before { 1654 | content: "\f206"; 1655 | } 1656 | .fa-bus:before { 1657 | content: "\f207"; 1658 | } 1659 | .fa-ioxhost:before { 1660 | content: "\f208"; 1661 | } 1662 | .fa-angellist:before { 1663 | content: "\f209"; 1664 | } 1665 | .fa-cc:before { 1666 | content: "\f20a"; 1667 | } 1668 | .fa-shekel:before, 1669 | .fa-sheqel:before, 1670 | .fa-ils:before { 1671 | content: "\f20b"; 1672 | } 1673 | .fa-meanpath:before { 1674 | content: "\f20c"; 1675 | } 1676 | -------------------------------------------------------------------------------- /style/css/github.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | github.com style (c) Vasily Polovnyov 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | color: #333; 12 | background: #f8f8f8; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-template_comment, 17 | .diff .hljs-header, 18 | .hljs-javadoc { 19 | color: #998; 20 | font-style: italic; 21 | } 22 | 23 | .hljs-keyword, 24 | .css .rule .hljs-keyword, 25 | .hljs-winutils, 26 | .javascript .hljs-title, 27 | .nginx .hljs-title, 28 | .hljs-subst, 29 | .hljs-request, 30 | .hljs-status { 31 | color: #333; 32 | font-weight: bold; 33 | } 34 | 35 | .hljs-number, 36 | .hljs-hexcolor, 37 | .ruby .hljs-constant { 38 | color: #099; 39 | } 40 | 41 | .hljs-string, 42 | .hljs-tag .hljs-value, 43 | .hljs-phpdoc, 44 | .tex .hljs-formula { 45 | color: #d14; 46 | } 47 | 48 | .hljs-title, 49 | .hljs-id, 50 | .coffeescript .hljs-params, 51 | .scss .hljs-preprocessor { 52 | color: #900; 53 | font-weight: bold; 54 | } 55 | 56 | .javascript .hljs-title, 57 | .lisp .hljs-title, 58 | .clojure .hljs-title, 59 | .hljs-subst { 60 | font-weight: normal; 61 | } 62 | 63 | .hljs-class .hljs-title, 64 | .haskell .hljs-type, 65 | .vhdl .hljs-literal, 66 | .tex .hljs-command { 67 | color: #458; 68 | font-weight: bold; 69 | } 70 | 71 | .hljs-tag, 72 | .hljs-tag .hljs-title, 73 | .hljs-rules .hljs-property, 74 | .django .hljs-tag .hljs-keyword { 75 | color: #000080; 76 | font-weight: normal; 77 | } 78 | 79 | .hljs-attribute, 80 | .hljs-variable, 81 | .lisp .hljs-body { 82 | color: #008080; 83 | } 84 | 85 | .hljs-regexp { 86 | color: #009926; 87 | } 88 | 89 | .hljs-symbol, 90 | .ruby .hljs-symbol .hljs-string, 91 | .lisp .hljs-keyword, 92 | .tex .hljs-special, 93 | .hljs-prompt { 94 | color: #990073; 95 | } 96 | 97 | .hljs-built_in, 98 | .lisp .hljs-title, 99 | .clojure .hljs-built_in { 100 | color: #0086b3; 101 | } 102 | 103 | .hljs-preprocessor, 104 | .hljs-pragma, 105 | .hljs-pi, 106 | .hljs-doctype, 107 | .hljs-shebang, 108 | .hljs-cdata { 109 | color: #999; 110 | font-weight: bold; 111 | } 112 | 113 | .hljs-deletion { 114 | background: #fdd; 115 | } 116 | 117 | .hljs-addition { 118 | background: #dfd; 119 | } 120 | 121 | .diff .hljs-change { 122 | background: #0086b3; 123 | } 124 | 125 | .hljs-chunk { 126 | color: #aaa; 127 | } 128 | -------------------------------------------------------------------------------- /style/css/markdown.css: -------------------------------------------------------------------------------- 1 | .markdown-body { 2 | font-family: sans-serif; 3 | -ms-text-size-adjust: 100%; 4 | -webkit-text-size-adjust: 100%; 5 | font: 13px Helvetica, arial, freesans, clean, sans-serif; 6 | line-height: 1.4; 7 | color: #333333; 8 | font-size: 15px; 9 | line-height: 1.7; 10 | overflow: hidden; 11 | word-wrap: break-word; 12 | } 13 | 14 | .markdown-body a { 15 | background: transparent; 16 | } 17 | 18 | .markdown-body a:active, 19 | .markdown-body a:hover { 20 | outline: 0; 21 | } 22 | 23 | .markdown-body strong { 24 | font-weight: bold; 25 | } 26 | 27 | .markdown-body h1 { 28 | font-size: 2em; 29 | margin: 0.67em 0; 30 | } 31 | 32 | .markdown-body img { 33 | border: 0; 34 | } 35 | 36 | .markdown-body hr { 37 | -moz-box-sizing: content-box; 38 | box-sizing: content-box; 39 | height: 0; 40 | } 41 | 42 | .markdown-body pre { 43 | overflow: auto; 44 | } 45 | 46 | .markdown-body code, 47 | .markdown-body pre { 48 | font-family: monospace, monospace; 49 | font-size: 1em; 50 | } 51 | 52 | .markdown-body table { 53 | border-collapse: collapse; 54 | border-spacing: 0; 55 | } 56 | 57 | .markdown-body td, 58 | .markdown-body th { 59 | padding: 0; 60 | } 61 | 62 | .markdown-body * { 63 | -moz-box-sizing: border-box; 64 | box-sizing: border-box; 65 | } 66 | 67 | .markdown-body a { 68 | color: #4183c4; 69 | text-decoration: none; 70 | } 71 | 72 | .markdown-body a:hover { 73 | text-decoration: underline; 74 | } 75 | 76 | .markdown-body a:focus, 77 | .markdown-body a:active { 78 | text-decoration: underline; 79 | } 80 | 81 | .markdown-body hr { 82 | height: 0; 83 | margin: 15px 0; 84 | overflow: hidden; 85 | background: transparent; 86 | border: 0; 87 | border-bottom: 1px solid #ddd; 88 | } 89 | 90 | .markdown-body hr:before, 91 | .markdown-body hr:after { 92 | content: " "; 93 | display: table; 94 | } 95 | 96 | .markdown-body hr:after { 97 | clear: both; 98 | } 99 | 100 | .markdown-body ol ol { 101 | list-style-type: lower-roman; 102 | } 103 | 104 | .markdown-body h1, 105 | .markdown-body h2, 106 | .markdown-body h3, 107 | .markdown-body h4, 108 | .markdown-body h5, 109 | .markdown-body h6 { 110 | margin-top: 15px; 111 | margin-bottom: 15px; 112 | line-height: 1.1; 113 | } 114 | 115 | .markdown-body h1 { 116 | font-size: 30px; 117 | } 118 | 119 | .markdown-body h2 { 120 | font-size: 21px; 121 | } 122 | 123 | .markdown-body h3 { 124 | font-size: 16px; 125 | } 126 | 127 | .markdown-body h4 { 128 | font-size: 14px; 129 | } 130 | 131 | .markdown-body h5 { 132 | font-size: 12px; 133 | } 134 | 135 | .markdown-body h6 { 136 | font-size: 11px; 137 | } 138 | 139 | .markdown-body blockquote { 140 | margin: 0; 141 | } 142 | 143 | .markdown-body ul, 144 | .markdown-body ol { 145 | padding: 0; 146 | margin-top: 0; 147 | margin-bottom: 0; 148 | } 149 | 150 | .markdown-body dd { 151 | margin-left: 0; 152 | } 153 | 154 | .markdown-body code, 155 | .markdown-body pre { 156 | font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; 157 | font-size: 12px; 158 | } 159 | 160 | .markdown-body pre { 161 | margin-top: 0; 162 | margin-bottom: 0; 163 | } 164 | 165 | .markdown-body>*:first-child { 166 | margin-top: 0 !important; 167 | } 168 | 169 | .markdown-body>*:last-child { 170 | margin-bottom: 0 !important; 171 | } 172 | 173 | .markdown-body a.anchor { 174 | display: block; 175 | padding-right: 6px; 176 | padding-left: 30px; 177 | margin-left: -30px; 178 | cursor: pointer; 179 | position: absolute; 180 | top: 0; 181 | left: 0; 182 | bottom: 0; 183 | } 184 | 185 | .markdown-body a.anchor:focus { 186 | outline: none; 187 | } 188 | 189 | .markdown-body h1, 190 | .markdown-body h2, 191 | .markdown-body h3, 192 | .markdown-body h4, 193 | .markdown-body h5, 194 | .markdown-body h6 { 195 | margin: 1em 0 15px; 196 | padding: 0; 197 | font-weight: bold; 198 | line-height: 1.7; 199 | cursor: text; 200 | position: relative; 201 | } 202 | 203 | .markdown-body h1 { 204 | font-size: 2.5em; 205 | border-bottom: 1px solid #ddd; 206 | } 207 | 208 | .markdown-body h2 { 209 | font-size: 2em; 210 | border-bottom: 1px solid #eee; 211 | } 212 | 213 | .markdown-body h3 { 214 | font-size: 1.5em; 215 | } 216 | 217 | .markdown-body h4 { 218 | font-size: 1.2em; 219 | } 220 | 221 | .markdown-body h5 { 222 | font-size: 1em; 223 | } 224 | 225 | .markdown-body h6 { 226 | color: #777; 227 | font-size: 1em; 228 | } 229 | 230 | .markdown-body p, 231 | .markdown-body blockquote, 232 | .markdown-body ul, 233 | .markdown-body ol, 234 | .markdown-body dl, 235 | .markdown-body table, 236 | .markdown-body pre { 237 | margin: 15px 0; 238 | } 239 | 240 | .markdown-body hr { 241 | background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC) repeat-x 0 0; 242 | border: 0 none; 243 | color: #ccc; 244 | height: 4px; 245 | padding: 0; 246 | margin: 15px 0; 247 | } 248 | 249 | .markdown-body ul, 250 | .markdown-body ol { 251 | padding-left: 5%; 252 | } 253 | 254 | .markdown-body ol ol, 255 | .markdown-body ol ul { 256 | margin-top: 0; 257 | margin-bottom: 0; 258 | } 259 | 260 | .markdown-body dl { 261 | padding: 0; 262 | } 263 | 264 | .markdown-body dl dt { 265 | font-size: 14px; 266 | font-weight: bold; 267 | font-style: italic; 268 | padding: 0; 269 | margin-top: 15px; 270 | } 271 | 272 | .markdown-body dl dd { 273 | margin-bottom: 15px; 274 | padding: 0 15px; 275 | } 276 | 277 | .markdown-body blockquote { 278 | border-left: 4px solid #DDD; 279 | padding: 0 15px; 280 | color: #777; 281 | } 282 | 283 | .markdown-body blockquote>:first-child { 284 | margin-top: 0px; 285 | } 286 | 287 | .markdown-body blockquote>:last-child { 288 | margin-bottom: 0px; 289 | } 290 | 291 | .markdown-body table { 292 | width: 100%; 293 | overflow: auto; 294 | display: block; 295 | } 296 | 297 | .markdown-body table th { 298 | font-weight: bold; 299 | } 300 | 301 | .markdown-body table th, 302 | .markdown-body table td { 303 | border: 1px solid #ddd; 304 | padding: 6px 13px; 305 | } 306 | 307 | .markdown-body table tr { 308 | border-top: 1px solid #ccc; 309 | background-color: #fff; 310 | } 311 | 312 | .markdown-body table tr:nth-child(2n) { 313 | background-color: #f8f8f8; 314 | } 315 | 316 | .markdown-body img { 317 | max-width: 100%; 318 | -moz-box-sizing: border-box; 319 | box-sizing: border-box; 320 | } 321 | 322 | .markdown-body code { 323 | padding: 4px 4px 0; 324 | font-size: 90%; 325 | color: #c7254e; 326 | background-color: #f9f2f4; 327 | border-radius: 4px; 328 | border: none; 329 | vertical-align: bottom; 330 | line-height: inherit; 331 | } 332 | 333 | .markdown-body code:before, 334 | .markdown-body code:after { 335 | content: "\00a0"; 336 | letter-spacing: -0.5em; 337 | } 338 | 339 | .markdown-body pre>code { 340 | margin: 0; 341 | padding: 0; 342 | white-space: pre; 343 | border: none; 344 | background: transparent; 345 | color: inherit; 346 | } 347 | 348 | .markdown-body .highlight pre, 349 | .markdown-body pre { 350 | background-color: #f8f8f8; 351 | border: 1px solid #ddd; 352 | font-size: 13px; 353 | line-height: 19px; 354 | overflow: auto; 355 | padding: 6px 10px; 356 | border-radius: 3px; 357 | -webkit-overflow-scrolling: touch; 358 | } 359 | 360 | .markdown-body pre { 361 | word-wrap: normal; 362 | } 363 | 364 | .markdown-body pre code { 365 | margin: 0; 366 | padding: 0; 367 | background-color: transparent; 368 | border: none; 369 | word-wrap: normal; 370 | max-width: initial; 371 | display: inline; 372 | overflow: initial; 373 | line-height: inherit; 374 | } 375 | 376 | .markdown-body pre code:before, 377 | .markdown-body pre code:after { 378 | content: normal; 379 | } 380 | 381 | .markdown-body .highlight { 382 | background: #ffffff; 383 | } 384 | 385 | .markdown-body .highlight .c { 386 | color: #999988; 387 | font-style: italic; 388 | } 389 | 390 | .markdown-body .highlight .err { 391 | color: #a61717; 392 | background-color: #e3d2d2; 393 | } 394 | 395 | .markdown-body .highlight .k { 396 | font-weight: bold; 397 | } 398 | 399 | .markdown-body .highlight .o { 400 | font-weight: bold; 401 | } 402 | 403 | .markdown-body .highlight .cm { 404 | color: #999988; 405 | font-style: italic; 406 | } 407 | 408 | .markdown-body .highlight .cp { 409 | color: #999999; 410 | font-weight: bold; 411 | } 412 | 413 | .markdown-body .highlight .c1 { 414 | color: #999988; 415 | font-style: italic; 416 | } 417 | 418 | .markdown-body .highlight .cs { 419 | color: #999999; 420 | font-weight: bold; 421 | font-style: italic; 422 | } 423 | 424 | .markdown-body .highlight .gd { 425 | color: #000000; 426 | background-color: #ffdddd; 427 | } 428 | 429 | .markdown-body .highlight .gd .x { 430 | color: #000000; 431 | background-color: #ffaaaa; 432 | } 433 | 434 | .markdown-body .highlight .ge { 435 | font-style: italic; 436 | } 437 | 438 | .markdown-body .highlight .gr { 439 | color: #aa0000; 440 | } 441 | 442 | .markdown-body .highlight .gh { 443 | color: #999999; 444 | } 445 | 446 | .markdown-body .highlight .gi { 447 | color: #000000; 448 | background-color: #ddffdd; 449 | } 450 | 451 | .markdown-body .highlight .gi .x { 452 | color: #000000; 453 | background-color: #aaffaa; 454 | } 455 | 456 | .markdown-body .highlight .go { 457 | color: #888888; 458 | } 459 | 460 | .markdown-body .highlight .gp { 461 | color: #555555; 462 | } 463 | 464 | .markdown-body .highlight .gs { 465 | font-weight: bold; 466 | } 467 | 468 | .markdown-body .highlight .gu { 469 | color: #800080; 470 | font-weight: bold; 471 | } 472 | 473 | .markdown-body .highlight .gt { 474 | color: #aa0000; 475 | } 476 | 477 | .markdown-body .highlight .kc { 478 | font-weight: bold; 479 | } 480 | 481 | .markdown-body .highlight .kd { 482 | font-weight: bold; 483 | } 484 | 485 | .markdown-body .highlight .kn { 486 | font-weight: bold; 487 | } 488 | 489 | .markdown-body .highlight .kp { 490 | font-weight: bold; 491 | } 492 | 493 | .markdown-body .highlight .kr { 494 | font-weight: bold; 495 | } 496 | 497 | .markdown-body .highlight .kt { 498 | color: #445588; 499 | font-weight: bold; 500 | } 501 | 502 | .markdown-body .highlight .m { 503 | color: #009999; 504 | } 505 | 506 | .markdown-body .highlight .s { 507 | color: #dd1144; 508 | } 509 | 510 | .markdown-body .highlight .n { 511 | color: #333333; 512 | } 513 | 514 | .markdown-body .highlight .na { 515 | color: teal; 516 | } 517 | 518 | .markdown-body .highlight .nb { 519 | color: #0086b3; 520 | } 521 | 522 | .markdown-body .highlight .nc { 523 | color: #445588; 524 | font-weight: bold; 525 | } 526 | 527 | .markdown-body .highlight .no { 528 | color: teal; 529 | } 530 | 531 | .markdown-body .highlight .ni { 532 | color: purple; 533 | } 534 | 535 | .markdown-body .highlight .ne { 536 | color: #990000; 537 | font-weight: bold; 538 | } 539 | 540 | .markdown-body .highlight .nf { 541 | color: #990000; 542 | font-weight: bold; 543 | } 544 | 545 | .markdown-body .highlight .nn { 546 | color: #555555; 547 | } 548 | 549 | .markdown-body .highlight .nt { 550 | color: navy; 551 | } 552 | 553 | .markdown-body .highlight .nv { 554 | color: teal; 555 | } 556 | 557 | .markdown-body .highlight .ow { 558 | font-weight: bold; 559 | } 560 | 561 | .markdown-body .highlight .w { 562 | color: #bbbbbb; 563 | } 564 | 565 | .markdown-body .highlight .mf { 566 | color: #009999; 567 | } 568 | 569 | .markdown-body .highlight .mh { 570 | color: #009999; 571 | } 572 | 573 | .markdown-body .highlight .mi { 574 | color: #009999; 575 | } 576 | 577 | .markdown-body .highlight .mo { 578 | color: #009999; 579 | } 580 | 581 | .markdown-body .highlight .sb { 582 | color: #dd1144; 583 | } 584 | 585 | .markdown-body .highlight .sc { 586 | color: #dd1144; 587 | } 588 | 589 | .markdown-body .highlight .sd { 590 | color: #dd1144; 591 | } 592 | 593 | .markdown-body .highlight .s2 { 594 | color: #dd1144; 595 | } 596 | 597 | .markdown-body .highlight .se { 598 | color: #dd1144; 599 | } 600 | 601 | .markdown-body .highlight .sh { 602 | color: #dd1144; 603 | } 604 | 605 | .markdown-body .highlight .si { 606 | color: #dd1144; 607 | } 608 | 609 | .markdown-body .highlight .sx { 610 | color: #dd1144; 611 | } 612 | 613 | .markdown-body .highlight .sr { 614 | color: #009926; 615 | } 616 | 617 | .markdown-body .highlight .s1 { 618 | color: #dd1144; 619 | } 620 | 621 | .markdown-body .highlight .ss { 622 | color: #990073; 623 | } 624 | 625 | .markdown-body .highlight .bp { 626 | color: #999999; 627 | } 628 | 629 | .markdown-body .highlight .vc { 630 | color: teal; 631 | } 632 | 633 | .markdown-body .highlight .vg { 634 | color: teal; 635 | } 636 | 637 | .markdown-body .highlight .vi { 638 | color: teal; 639 | } 640 | 641 | .markdown-body .highlight .il { 642 | color: #009999; 643 | } 644 | 645 | .markdown-body .highlight .gc { 646 | color: #999; 647 | background-color: #EAF2F5; 648 | } 649 | -------------------------------------------------------------------------------- /style/less/_foo.less: -------------------------------------------------------------------------------- 1 | @base: #f04615; 2 | @width: 0.5; 3 | 4 | .class { 5 | width: percentage(@width); // returns `50%` 6 | color: saturate(@base, 5%); 7 | background-color: spin(lighten(@base, 25%), 8); 8 | } -------------------------------------------------------------------------------- /style/less/chart_curve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fouber/static-resource-digest-project/69d94d0a43801003ad8732f5bab009d8bdee5b3b/style/less/chart_curve.png -------------------------------------------------------------------------------- /style/less/foo.less: -------------------------------------------------------------------------------- 1 | /** 2 | * @see http://www.lesscss.net/features/ 3 | */ 4 | 5 | /* import */ 6 | 7 | @import "_foo.less"; 8 | 9 | /* Variables */ 10 | 11 | @nice-blue: #5B83AD; 12 | @light-blue: @nice-blue + #111; 13 | 14 | #header { 15 | color: @light-blue; 16 | } 17 | 18 | /* Mixins */ 19 | 20 | .bordered { 21 | border-top: dotted 1px black; 22 | border-bottom: solid 2px black; 23 | } 24 | 25 | #menu a { 26 | color: #111; 27 | .bordered; 28 | } 29 | 30 | .post a { 31 | color: red; 32 | .bordered; 33 | } 34 | 35 | /* Nesting */ 36 | 37 | #header { 38 | color: black; 39 | .navigation { 40 | font-size: 12px; 41 | } 42 | .logo { 43 | width: 300px; 44 | background: url(chart_curve.png) 45 | } 46 | } -------------------------------------------------------------------------------- /style/sass/comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fouber/static-resource-digest-project/69d94d0a43801003ad8732f5bab009d8bdee5b3b/style/sass/comment.png -------------------------------------------------------------------------------- /style/sass/foo.sass: -------------------------------------------------------------------------------- 1 | .div 2 | color: blue 3 | .b 4 | color: black 5 | font-weight: bold 6 | text-decoration: none 7 | .c 8 | color: white 9 | background: url(comment.png) -------------------------------------------------------------------------------- /style/scss/_reset.scss: -------------------------------------------------------------------------------- 1 | html, 2 | body, 3 | ul, 4 | ol { 5 | margin: 0; 6 | padding: 0; 7 | } -------------------------------------------------------------------------------- /style/scss/connect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fouber/static-resource-digest-project/69d94d0a43801003ad8732f5bab009d8bdee5b3b/style/scss/connect.png -------------------------------------------------------------------------------- /style/scss/foo.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * @see http://sass-lang.com/guide 3 | */ 4 | 5 | 6 | /* import */ 7 | 8 | @import 'reset'; 9 | 10 | body { 11 | margin: 10px 20px; 12 | } 13 | 14 | /* Variables */ 15 | 16 | $font-stack: Helvetica, sans-serif; 17 | $primary-color: #333; 18 | 19 | .var { 20 | font: 100% $font-stack; 21 | color: $primary-color; 22 | background: url(connect.png) 23 | } 24 | 25 | /* Nesting */ 26 | 27 | nav { 28 | ul { 29 | margin: 0; 30 | padding: 0; 31 | list-style: none; 32 | } 33 | 34 | li { display: inline-block; } 35 | 36 | a { 37 | display: block; 38 | padding: 6px 12px; 39 | text-decoration: none; 40 | } 41 | } 42 | 43 | /* Mixins */ 44 | 45 | @mixin border-radius($radius) { 46 | -webkit-border-radius: $radius; 47 | -moz-border-radius: $radius; 48 | -ms-border-radius: $radius; 49 | border-radius: $radius; 50 | } 51 | 52 | .box { @include border-radius(10px); } 53 | 54 | /* Extend/Inheritance */ 55 | .message { 56 | border: 1px solid #ccc; 57 | padding: 10px; 58 | color: #333; 59 | } 60 | 61 | .success { 62 | @extend .message; 63 | border-color: green; 64 | } 65 | 66 | .error { 67 | @extend .message; 68 | border-color: red; 69 | } 70 | 71 | .warning { 72 | @extend .message; 73 | border-color: yellow; 74 | } 75 | 76 | /* Operators */ 77 | 78 | .container { width: 100%; } 79 | 80 | article[role="main"] { 81 | float: left; 82 | width: 600px / 960px * 100%; 83 | } 84 | 85 | aside[role="complimentary"] { 86 | float: right; 87 | width: 300px / 960px * 100%; 88 | } -------------------------------------------------------------------------------- /style/stylus/compress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fouber/static-resource-digest-project/69d94d0a43801003ad8732f5bab009d8bdee5b3b/style/stylus/compress.png -------------------------------------------------------------------------------- /style/stylus/foo.styl: -------------------------------------------------------------------------------- 1 | border-radius() 2 | -webkit-border-radius: arguments 3 | -moz-border-radius: arguments 4 | border-radius: arguments 5 | 6 | .styl a 7 | font: 12px/1.4 "Lucida Grande", Arial, sans-serif 8 | background: black 9 | color: #ccc 10 | 11 | .styl form input 12 | padding: 5px 13 | border: 1px solid 14 | border-radius: 5px 15 | background: url(compress.png) -------------------------------------------------------------------------------- /template/ejs/foo.ejs: -------------------------------------------------------------------------------- 1 |
    2 | <% for(var i=0; i < supplies.length; i++) {%> 3 |
  • <%= supplies[i] %>
  • 4 | <% } %> 5 |
-------------------------------------------------------------------------------- /template/handlebars/foo.handlebars: -------------------------------------------------------------------------------- 1 |

{{title}}

2 |
3 | {{body}} 4 |
--------------------------------------------------------------------------------