├── .gitattributes ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── db └── vim_tips.zip ├── models ├── api.go ├── cast.go ├── id.go └── tips.go ├── public ├── css │ ├── about.css │ ├── admin.css │ ├── casts.css │ ├── font-awesome-4.2.0 │ │ ├── css │ │ │ ├── font-awesome.css │ │ │ └── font-awesome.min.css │ │ ├── fonts │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ └── fontawesome-webfont.woff │ │ ├── less │ │ │ ├── bordered-pulled.less │ │ │ ├── core.less │ │ │ ├── fixed-width.less │ │ │ ├── font-awesome.less │ │ │ ├── icons.less │ │ │ ├── larger.less │ │ │ ├── list.less │ │ │ ├── mixins.less │ │ │ ├── path.less │ │ │ ├── rotated-flipped.less │ │ │ ├── spinning.less │ │ │ ├── stacked.less │ │ │ └── variables.less │ │ └── scss │ │ │ ├── _bordered-pulled.scss │ │ │ ├── _core.scss │ │ │ ├── _fixed-width.scss │ │ │ ├── _icons.scss │ │ │ ├── _larger.scss │ │ │ ├── _list.scss │ │ │ ├── _mixins.scss │ │ │ ├── _path.scss │ │ │ ├── _rotated-flipped.scss │ │ │ ├── _spinning.scss │ │ │ ├── _stacked.scss │ │ │ ├── _variables.scss │ │ │ └── font-awesome.scss │ ├── simditor.css │ ├── style.css │ └── tools.css ├── img │ ├── Alfred.jpg │ ├── Swift.jpg │ ├── Vim.jpg │ ├── api.png │ ├── iTimothy.jpg │ ├── image.png │ ├── lightbulb.png │ ├── loading-upload.gif │ ├── robot.png │ ├── rocket.png │ └── vim.png └── js │ ├── hotkeys.js │ ├── module.js │ ├── simditor.js │ ├── tips.js │ └── ws.js ├── routers ├── about.go ├── admin.go ├── admin_casts.go ├── admin_pass.go ├── admin_tips.go ├── api.go ├── api_test.go ├── casts.go ├── index.go ├── routers.go ├── tip.go ├── tools.go └── websocket.go ├── screenshots ├── 1.png ├── 2.png ├── 3.png ├── 4.png └── 5.png ├── templates ├── 500.tpl ├── about.tpl ├── admin │ ├── casts_add.tpl │ ├── casts_index.tpl │ ├── casts_modify.tpl │ ├── index.tpl │ ├── layout.tpl │ ├── login.tpl │ ├── password.tpl │ └── tips_index.tpl ├── api.tpl ├── casts.tpl ├── index.tpl ├── layout.tpl ├── show.tpl ├── tip.tpl └── tools.tpl └── web.go /.gitattributes: -------------------------------------------------------------------------------- 1 | public/* linguist-vendored 2 | templates/* linguist-vendored 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled Object files, Static and Dynamic libs (Shared Objects) 2 | *.o 3 | *.a 4 | *.so 5 | 6 | # Folders 7 | _obj 8 | _test 9 | 10 | # Architecture specific extensions/prefixes 11 | *.[568vq] 12 | [568vq].out 13 | 14 | *.cgo1.go 15 | *.cgo2.c 16 | _cgo_defun.c 17 | _cgo_gotypes.go 18 | _cgo_export.* 19 | 20 | _testmain.go 21 | 22 | *.exe 23 | *.test 24 | 25 | *.swp 26 | web 27 | vim-tips-web 28 | gin-bin.exe 29 | gin-bin.exe~ 30 | *gin-bin* 31 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: go 2 | go: 3 | - 1.1 4 | - 1.2 5 | - release 6 | - tip 7 | 8 | script: 9 | - go test -v ./... 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Timothy 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | vim-tips-web 2 | ============ 3 | 4 | [](https://drone.io/github.com/TimothyYe/vim-tips-web/latest) 5 | 6 | [Vim-Tips.com](https://vim-tips.com) is a site to share tips for Vim. 7 | 8 | The first version of [Vim-Tips.com](https://vim-tips.com) is written by Rails. 9 | 10 | Now I re-designed this whole site and implemented it by Go & Martini web framework. 11 | 12 | ## Prerequisite 13 | 14 | * Go environment is needed. 15 | * MongoDB is installed. 16 | 17 | ## Download the sample database 18 | 19 | Download sample DB from: [https://github.com/TimothyYe/vim-tips-web/tree/master/db](https://github.com/TimothyYe/vim-tips-web/tree/master/db) 20 | 21 | ## Restore it to MongoDB 22 | 23 | * Unzip the database, the DB directory is: vim_tips 24 | * Restore it to MongoDB 25 | 26 | ```bash 27 | mongorestore -h localhost -u user -p pass -d vim_tips ./vim_tips 28 | ``` 29 | 30 | Note that username and password is the id and password for your MongoDB, for the default, -u & -p is not needed. 31 | 32 | ## Build it 33 | 34 | * Get source code from Github: 35 | 36 | ```bash 37 | git clone https://github.com/TimothyYe/vim-tips-web.git 38 | ``` 39 | * Go into the source code directory, get related library and then build it: 40 | 41 | ```bash 42 | cd vim-tips-web 43 | go get 44 | go build 45 | ``` 46 | 47 | ## Run it 48 | 49 | * Run vim-tips-web site: 50 | ```bash 51 | nohup ./vim-tips-web & 52 | ``` 53 | 54 | * Now, type [http://localhost:3000](http://localhost:3000) in web browser to visit the site. 55 | 56 | ## Screenshots 57 | 58 |  59 | 60 |  61 | 62 |  63 | 64 |  65 | 66 |  67 | 68 | ## Default username and password for admin panel 69 | 70 | Use default username & password to logon admin panel: 71 | 72 | * Username is:admin@vim-tips.com 73 | * Password is:111 74 | -------------------------------------------------------------------------------- /db/vim_tips.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/db/vim_tips.zip -------------------------------------------------------------------------------- /models/api.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "labix.org/v2/mgo/bson" 5 | ) 6 | 7 | type API struct { 8 | Id bson.ObjectId `bson:"_id,omitempty"` 9 | Type string 10 | Count uint64 11 | } 12 | -------------------------------------------------------------------------------- /models/cast.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "html/template" 5 | "labix.org/v2/mgo/bson" 6 | ) 7 | 8 | type Casts struct { 9 | Id bson.ObjectId `bson:"_id,omitempty"` 10 | Author string 11 | AuthorUrl string 12 | VisitCount int 13 | Title string 14 | LogoUrl string 15 | Intro string 16 | ShowNotes string 17 | Url string 18 | } 19 | 20 | type CastsView struct { 21 | Id string 22 | Author string 23 | AuthorUrl string 24 | VisitCount int 25 | Title string 26 | LogoUrl string 27 | Intro template.HTML 28 | ShowNotes template.HTML 29 | Url string 30 | } 31 | -------------------------------------------------------------------------------- /models/id.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "labix.org/v2/mgo/bson" 5 | ) 6 | 7 | type Identity struct { 8 | Id bson.ObjectId `bson:"_id,omitempty"` 9 | Email string 10 | Password []byte 11 | } 12 | -------------------------------------------------------------------------------- /models/tips.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "labix.org/v2/mgo/bson" 5 | ) 6 | 7 | type Tips struct { 8 | Id bson.ObjectId `bson:"_id,omitempty"` 9 | Content string 10 | Comment string 11 | } 12 | 13 | type TipsView struct { 14 | Id string 15 | Content string 16 | Comment string 17 | } 18 | -------------------------------------------------------------------------------- /public/css/about.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | /* ================ The Timeline ================ */ 4 | 5 | .timeline { 6 | position: relative; 7 | width: 660px; 8 | margin: 0 auto; 9 | margin-top: 20px; 10 | padding: 1em 0; 11 | list-style-type: none; 12 | } 13 | 14 | .timeline:before { 15 | position: absolute; 16 | left: 50%; 17 | top: 0; 18 | content: ' '; 19 | display: block; 20 | width: 6px; 21 | height: 100%; 22 | margin-left: -3px; 23 | background: rgb(80,80,80); 24 | background: -moz-linear-gradient(top, rgba(80,80,80,0) 0%, rgb(80,80,80) 8%, rgb(80,80,80) 92%, rgba(80,80,80,0) 100%); 25 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(30,87,153,1)), color-stop(100%,rgba(125,185,232,1))); 26 | background: -webkit-linear-gradient(top, rgba(80,80,80,0) 0%, rgb(80,80,80) 8%, rgb(80,80,80) 92%, rgba(80,80,80,0) 100%); 27 | background: -o-linear-gradient(top, rgba(80,80,80,0) 0%, rgb(80,80,80) 8%, rgb(80,80,80) 92%, rgba(80,80,80,0) 100%); 28 | background: -ms-linear-gradient(top, rgba(80,80,80,0) 0%, rgb(80,80,80) 8%, rgb(80,80,80) 92%, rgba(80,80,80,0) 100%); 29 | background: linear-gradient(to bottom, rgba(80,80,80,0) 0%, rgb(80,80,80) 8%, rgb(80,80,80) 92%, rgba(80,80,80,0) 100%); 30 | z-index: 5; 31 | } 32 | 33 | .timeline li { 34 | padding: 1em 0; 35 | } 36 | 37 | .timeline li:after { 38 | content: ""; 39 | display: block; 40 | height: 0; 41 | clear: both; 42 | visibility: hidden; 43 | } 44 | 45 | .direction-l { 46 | position: relative; 47 | width: 300px; 48 | float: left; 49 | text-align: right; 50 | } 51 | 52 | .direction-r { 53 | position: relative; 54 | width: 300px; 55 | float: right; 56 | } 57 | 58 | .flag-wrapper { 59 | position: relative; 60 | display: inline-block; 61 | 62 | text-align: center; 63 | } 64 | 65 | .flag { 66 | position: relative; 67 | display: inline; 68 | background: rgb(248,248,248); 69 | padding: 6px 10px; 70 | border-radius: 5px; 71 | 72 | font-weight: 600; 73 | text-align: left; 74 | } 75 | 76 | .direction-l .flag { 77 | -webkit-box-shadow: -1px 1px 1px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.15); 78 | -moz-box-shadow: -1px 1px 1px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.15); 79 | box-shadow: -1px 1px 1px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.15); 80 | } 81 | 82 | .direction-r .flag { 83 | -webkit-box-shadow: 1px 1px 1px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.15); 84 | -moz-box-shadow: 1px 1px 1px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.15); 85 | box-shadow: 1px 1px 1px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.15); 86 | } 87 | 88 | .direction-l .flag:before, 89 | .direction-r .flag:before { 90 | position: absolute; 91 | top: 50%; 92 | right: -40px; 93 | content: ' '; 94 | display: block; 95 | width: 20px; 96 | height: 20px; 97 | margin-top: -10px; 98 | background: #fff; 99 | border-radius: 10px; 100 | border: 4px solid rgb(255,80,80); 101 | z-index: 10; 102 | } 103 | 104 | .direction-r .flag:before { 105 | left: -40px; 106 | } 107 | 108 | .direction-l .flag:after { 109 | content: ""; 110 | position: absolute; 111 | left: 100%; 112 | top: 50%; 113 | height: 0; 114 | width: 0; 115 | margin-top: -8px; 116 | border: solid transparent; 117 | border-left-color: rgb(248,248,248); 118 | border-width: 8px; 119 | pointer-events: none; 120 | } 121 | 122 | .direction-r .flag:after { 123 | content: ""; 124 | position: absolute; 125 | right: 100%; 126 | top: 50%; 127 | height: 0; 128 | width: 0; 129 | margin-top: -8px; 130 | border: solid transparent; 131 | border-right-color: rgb(248,248,248); 132 | border-width: 8px; 133 | pointer-events: none; 134 | } 135 | 136 | .time-wrapper { 137 | display: inline; 138 | 139 | line-height: 1em; 140 | font-size: 0.66666em; 141 | color: rgb(250,80,80); 142 | vertical-align: middle; 143 | } 144 | 145 | .direction-l .time-wrapper { 146 | float: left; 147 | } 148 | 149 | .direction-r .time-wrapper { 150 | float: right; 151 | } 152 | 153 | .time { 154 | display: inline-block; 155 | padding: 4px 6px; 156 | background: rgb(248,248,248); 157 | } 158 | 159 | .desc { 160 | margin: 1em 0.75em 0 0; 161 | 162 | font-size: 0.77777em; 163 | font-style: italic; 164 | line-height: 1.5em; 165 | } 166 | 167 | .direction-r .desc { 168 | margin: 1em 0 0 0.75em; 169 | } 170 | 171 | /* ================ Timeline Media Queries ================ */ 172 | 173 | @media screen and (max-width: 660px) { 174 | 175 | .timeline { 176 | width: 100%; 177 | padding: 4em 0 1em 0; 178 | } 179 | 180 | .timeline li { 181 | padding: 2em 0; 182 | } 183 | 184 | .direction-l, 185 | .direction-r { 186 | float: none; 187 | width: 100%; 188 | 189 | text-align: center; 190 | } 191 | 192 | .flag-wrapper { 193 | text-align: center; 194 | } 195 | 196 | .flag { 197 | background: rgb(255,255,255); 198 | z-index: 15; 199 | } 200 | 201 | .direction-l .flag:before, 202 | .direction-r .flag:before { 203 | position: absolute; 204 | top: -30px; 205 | left: 50%; 206 | content: ' '; 207 | display: block; 208 | width: 12px; 209 | height: 12px; 210 | margin-left: -9px; 211 | background: #fff; 212 | border-radius: 10px; 213 | border: 4px solid rgb(255,80,80); 214 | z-index: 10; 215 | } 216 | 217 | .direction-l .flag:after, 218 | .direction-r .flag:after { 219 | content: ""; 220 | position: absolute; 221 | left: 50%; 222 | top: -8px; 223 | height: 0; 224 | width: 0; 225 | margin-left: -8px; 226 | border: solid transparent; 227 | border-bottom-color: rgb(255,255,255); 228 | border-width: 8px; 229 | pointer-events: none; 230 | } 231 | 232 | .time-wrapper { 233 | display: block; 234 | position: relative; 235 | margin: 4px 0 0 0; 236 | z-index: 14; 237 | } 238 | 239 | .direction-l .time-wrapper { 240 | float: none; 241 | } 242 | 243 | .direction-r .time-wrapper { 244 | float: none; 245 | } 246 | 247 | .desc { 248 | position: relative; 249 | margin: 1em 0 0 0; 250 | padding: 1em; 251 | background: rgb(245,245,245); 252 | -webkit-box-shadow: 0 0 1px rgba(0,0,0,0.20); 253 | -moz-box-shadow: 0 0 1px rgba(0,0,0,0.20); 254 | box-shadow: 0 0 1px rgba(0,0,0,0.20); 255 | 256 | z-index: 15; 257 | } 258 | 259 | .direction-l .desc, 260 | .direction-r .desc { 261 | position: relative; 262 | margin: 1em 1em 0 1em; 263 | padding: 1em; 264 | 265 | z-index: 15; 266 | } 267 | 268 | } 269 | 270 | @media screen and (min-width: 400px ?? max-width: 660px) { 271 | 272 | .direction-l .desc, 273 | .direction-r .desc { 274 | margin: 1em 4em 0 4em; 275 | } 276 | 277 | } -------------------------------------------------------------------------------- /public/css/admin.css: -------------------------------------------------------------------------------- 1 | #login-div { 2 | background: transparent; 3 | height: 200px; 4 | margin-top: 20px; 5 | } 6 | 7 | #login-logo { 8 | background: transparent; 9 | height: 200px; 10 | margin-top: 90px; 11 | } 12 | 13 | #footer { 14 | background-color: #F8F8F8; 15 | height: 50px; 16 | } 17 | 18 | #copyright { 19 | margin-top: 15px; 20 | } 21 | 22 | #casts_form{ 23 | margin-bottom: 100px; 24 | } -------------------------------------------------------------------------------- /public/css/casts.css: -------------------------------------------------------------------------------- 1 | /* Hover Card 2 | .......................................................................*/ 3 | div.catCard { 4 | border: solid 5px #e9e9e9; 5 | background: #d8d8d8; 6 | width: 300px; 7 | height: 340px; 8 | display: block; 9 | position: relative; 10 | overflow: hidden; 11 | } 12 | div.lowerCatCard { 13 | position: absolute; 14 | background: #e9e9e9; 15 | padding: 5px 5px; 16 | height: 140px; 17 | -webkit-transition: all 0.6s ease; 18 | -moz-transition: all 0.6s ease; 19 | -o-transition: all 0.6s ease; 20 | transition: all 0.6s ease; 21 | } 22 | div.lowerCatCard p { 23 | font-size: 0.6em; 24 | color: #774F38; 25 | font-family: "Microsoft YaHei", "微软雅黑", SimSun, "宋体", Heiti, "黑体", sans-serif; 26 | } 27 | div.lowerCatCard:hover { 28 | opacity: 0.95; 29 | bottom: 0; 30 | height: 340px; 31 | } 32 | div.catCard div.lowerCatCard { 33 | left: 0; 34 | bottom: -3%; 35 | width: 295px; 36 | } 37 | div.catCard:hover div.lowerCatCard { 38 | bottom: 0; 39 | } 40 | li.catCardList { 41 | width:305px; 42 | display: inline-block; 43 | margin-right: 19px; 44 | margin-left: 19px; 45 | margin-top: 25px; 46 | } 47 | li.catCardList-last { 48 | margin-right: 0; 49 | width:305px; 50 | display: inline-block; 51 | } 52 | ul.catCardList { 53 | margin: 0; 54 | } 55 | #catCardButton { 56 | position: absolute; 57 | width: 280px; 58 | bottom: 5px; 59 | -webkit-transition: all 0.6s ease; 60 | -moz-transition: all 0.6s ease; 61 | -o-transition: all 0.6s ease; 62 | } 63 | div.lowerCatCard:hover #catCardButton { 64 | bottom: 5px; 65 | } 66 | .catCard img { 67 | border: 1px solid #dddddd; 68 | width: 300px; 69 | height: 195px; 70 | } 71 | .catCard img:hover { 72 | border: 1px solid #bababa; 73 | } 74 | 75 | /* Button 76 | .......................................................................*/ 77 | .button { 78 | cursor: pointer; 79 | font-size: 14px !important; 80 | color: #ffffff; 81 | padding: 7px 10px !important; 82 | text-decoration: none !important; 83 | text-transform: uppercase !important; 84 | letter-spacing: 0 !important; 85 | background: #000; 86 | border: none; 87 | border-bottom: solid 1px #c90c12; 88 | text-align: center; 89 | margin-top: 10px; 90 | } 91 | .button:hover { 92 | background-color: #c90c12; 93 | border: none; 94 | border-bottom: solid 1px #000; 95 | box-shadow: 0 2px 3px #a8a8a8; 96 | transform: scale(1.04); 97 | -webkit-transform: scale(1.04); 98 | -moz-transform: scale(1.04); 99 | -o-transform: scale(1.04); 100 | -ms-transform: scale(1.04); 101 | } 102 | .button:active { 103 | background: #000; 104 | } 105 | .button a { 106 | color: #ffffff; 107 | padding: 7px 30px !important; 108 | text-decoration: none; 109 | } 110 | .button a:hover { 111 | color: #ffffff; 112 | } 113 | .button:hover { 114 | color: #fff; 115 | } -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/css/font-awesome.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/css/font-awesome-4.2.0/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/css/font-awesome-4.2.0/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/css/font-awesome-4.2.0/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/css/font-awesome-4.2.0/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .pull-right { float: right; } 11 | .pull-left { float: left; } 12 | 13 | .@{fa-css-prefix} { 14 | &.pull-left { margin-right: .3em; } 15 | &.pull-right { margin-left: .3em; } 16 | } 17 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "spinning.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | 13 | .fa-icon-rotate(@degrees, @rotation) { 14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation); 15 | -webkit-transform: rotate(@degrees); 16 | -ms-transform: rotate(@degrees); 17 | transform: rotate(@degrees); 18 | } 19 | 20 | .fa-icon-flip(@horiz, @vert, @rotation) { 21 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1); 22 | -webkit-transform: scale(@horiz, @vert); 23 | -ms-transform: scale(@horiz, @vert); 24 | transform: scale(@horiz, @vert); 25 | } 26 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 9 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 10 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 11 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/less/spinning.less: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | @-webkit-keyframes fa-spin { 10 | 0% { 11 | -webkit-transform: rotate(0deg); 12 | transform: rotate(0deg); 13 | } 14 | 100% { 15 | -webkit-transform: rotate(359deg); 16 | transform: rotate(359deg); 17 | } 18 | } 19 | 20 | @keyframes fa-spin { 21 | 0% { 22 | -webkit-transform: rotate(0deg); 23 | transform: rotate(0deg); 24 | } 25 | 100% { 26 | -webkit-transform: rotate(359deg); 27 | transform: rotate(359deg); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/less/variables.less: -------------------------------------------------------------------------------- 1 | // Variables 2 | // -------------------------- 3 | 4 | @fa-font-path: "../fonts"; 5 | //@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts"; // for referencing Bootstrap CDN font files directly 6 | @fa-css-prefix: fa; 7 | @fa-version: "4.2.0"; 8 | @fa-border-color: #eee; 9 | @fa-inverse: #fff; 10 | @fa-li-width: (30em / 14); 11 | 12 | @fa-var-adjust: "\f042"; 13 | @fa-var-adn: "\f170"; 14 | @fa-var-align-center: "\f037"; 15 | @fa-var-align-justify: "\f039"; 16 | @fa-var-align-left: "\f036"; 17 | @fa-var-align-right: "\f038"; 18 | @fa-var-ambulance: "\f0f9"; 19 | @fa-var-anchor: "\f13d"; 20 | @fa-var-android: "\f17b"; 21 | @fa-var-angellist: "\f209"; 22 | @fa-var-angle-double-down: "\f103"; 23 | @fa-var-angle-double-left: "\f100"; 24 | @fa-var-angle-double-right: "\f101"; 25 | @fa-var-angle-double-up: "\f102"; 26 | @fa-var-angle-down: "\f107"; 27 | @fa-var-angle-left: "\f104"; 28 | @fa-var-angle-right: "\f105"; 29 | @fa-var-angle-up: "\f106"; 30 | @fa-var-apple: "\f179"; 31 | @fa-var-archive: "\f187"; 32 | @fa-var-area-chart: "\f1fe"; 33 | @fa-var-arrow-circle-down: "\f0ab"; 34 | @fa-var-arrow-circle-left: "\f0a8"; 35 | @fa-var-arrow-circle-o-down: "\f01a"; 36 | @fa-var-arrow-circle-o-left: "\f190"; 37 | @fa-var-arrow-circle-o-right: "\f18e"; 38 | @fa-var-arrow-circle-o-up: "\f01b"; 39 | @fa-var-arrow-circle-right: "\f0a9"; 40 | @fa-var-arrow-circle-up: "\f0aa"; 41 | @fa-var-arrow-down: "\f063"; 42 | @fa-var-arrow-left: "\f060"; 43 | @fa-var-arrow-right: "\f061"; 44 | @fa-var-arrow-up: "\f062"; 45 | @fa-var-arrows: "\f047"; 46 | @fa-var-arrows-alt: "\f0b2"; 47 | @fa-var-arrows-h: "\f07e"; 48 | @fa-var-arrows-v: "\f07d"; 49 | @fa-var-asterisk: "\f069"; 50 | @fa-var-at: "\f1fa"; 51 | @fa-var-automobile: "\f1b9"; 52 | @fa-var-backward: "\f04a"; 53 | @fa-var-ban: "\f05e"; 54 | @fa-var-bank: "\f19c"; 55 | @fa-var-bar-chart: "\f080"; 56 | @fa-var-bar-chart-o: "\f080"; 57 | @fa-var-barcode: "\f02a"; 58 | @fa-var-bars: "\f0c9"; 59 | @fa-var-beer: "\f0fc"; 60 | @fa-var-behance: "\f1b4"; 61 | @fa-var-behance-square: "\f1b5"; 62 | @fa-var-bell: "\f0f3"; 63 | @fa-var-bell-o: "\f0a2"; 64 | @fa-var-bell-slash: "\f1f6"; 65 | @fa-var-bell-slash-o: "\f1f7"; 66 | @fa-var-bicycle: "\f206"; 67 | @fa-var-binoculars: "\f1e5"; 68 | @fa-var-birthday-cake: "\f1fd"; 69 | @fa-var-bitbucket: "\f171"; 70 | @fa-var-bitbucket-square: "\f172"; 71 | @fa-var-bitcoin: "\f15a"; 72 | @fa-var-bold: "\f032"; 73 | @fa-var-bolt: "\f0e7"; 74 | @fa-var-bomb: "\f1e2"; 75 | @fa-var-book: "\f02d"; 76 | @fa-var-bookmark: "\f02e"; 77 | @fa-var-bookmark-o: "\f097"; 78 | @fa-var-briefcase: "\f0b1"; 79 | @fa-var-btc: "\f15a"; 80 | @fa-var-bug: "\f188"; 81 | @fa-var-building: "\f1ad"; 82 | @fa-var-building-o: "\f0f7"; 83 | @fa-var-bullhorn: "\f0a1"; 84 | @fa-var-bullseye: "\f140"; 85 | @fa-var-bus: "\f207"; 86 | @fa-var-cab: "\f1ba"; 87 | @fa-var-calculator: "\f1ec"; 88 | @fa-var-calendar: "\f073"; 89 | @fa-var-calendar-o: "\f133"; 90 | @fa-var-camera: "\f030"; 91 | @fa-var-camera-retro: "\f083"; 92 | @fa-var-car: "\f1b9"; 93 | @fa-var-caret-down: "\f0d7"; 94 | @fa-var-caret-left: "\f0d9"; 95 | @fa-var-caret-right: "\f0da"; 96 | @fa-var-caret-square-o-down: "\f150"; 97 | @fa-var-caret-square-o-left: "\f191"; 98 | @fa-var-caret-square-o-right: "\f152"; 99 | @fa-var-caret-square-o-up: "\f151"; 100 | @fa-var-caret-up: "\f0d8"; 101 | @fa-var-cc: "\f20a"; 102 | @fa-var-cc-amex: "\f1f3"; 103 | @fa-var-cc-discover: "\f1f2"; 104 | @fa-var-cc-mastercard: "\f1f1"; 105 | @fa-var-cc-paypal: "\f1f4"; 106 | @fa-var-cc-stripe: "\f1f5"; 107 | @fa-var-cc-visa: "\f1f0"; 108 | @fa-var-certificate: "\f0a3"; 109 | @fa-var-chain: "\f0c1"; 110 | @fa-var-chain-broken: "\f127"; 111 | @fa-var-check: "\f00c"; 112 | @fa-var-check-circle: "\f058"; 113 | @fa-var-check-circle-o: "\f05d"; 114 | @fa-var-check-square: "\f14a"; 115 | @fa-var-check-square-o: "\f046"; 116 | @fa-var-chevron-circle-down: "\f13a"; 117 | @fa-var-chevron-circle-left: "\f137"; 118 | @fa-var-chevron-circle-right: "\f138"; 119 | @fa-var-chevron-circle-up: "\f139"; 120 | @fa-var-chevron-down: "\f078"; 121 | @fa-var-chevron-left: "\f053"; 122 | @fa-var-chevron-right: "\f054"; 123 | @fa-var-chevron-up: "\f077"; 124 | @fa-var-child: "\f1ae"; 125 | @fa-var-circle: "\f111"; 126 | @fa-var-circle-o: "\f10c"; 127 | @fa-var-circle-o-notch: "\f1ce"; 128 | @fa-var-circle-thin: "\f1db"; 129 | @fa-var-clipboard: "\f0ea"; 130 | @fa-var-clock-o: "\f017"; 131 | @fa-var-close: "\f00d"; 132 | @fa-var-cloud: "\f0c2"; 133 | @fa-var-cloud-download: "\f0ed"; 134 | @fa-var-cloud-upload: "\f0ee"; 135 | @fa-var-cny: "\f157"; 136 | @fa-var-code: "\f121"; 137 | @fa-var-code-fork: "\f126"; 138 | @fa-var-codepen: "\f1cb"; 139 | @fa-var-coffee: "\f0f4"; 140 | @fa-var-cog: "\f013"; 141 | @fa-var-cogs: "\f085"; 142 | @fa-var-columns: "\f0db"; 143 | @fa-var-comment: "\f075"; 144 | @fa-var-comment-o: "\f0e5"; 145 | @fa-var-comments: "\f086"; 146 | @fa-var-comments-o: "\f0e6"; 147 | @fa-var-compass: "\f14e"; 148 | @fa-var-compress: "\f066"; 149 | @fa-var-copy: "\f0c5"; 150 | @fa-var-copyright: "\f1f9"; 151 | @fa-var-credit-card: "\f09d"; 152 | @fa-var-crop: "\f125"; 153 | @fa-var-crosshairs: "\f05b"; 154 | @fa-var-css3: "\f13c"; 155 | @fa-var-cube: "\f1b2"; 156 | @fa-var-cubes: "\f1b3"; 157 | @fa-var-cut: "\f0c4"; 158 | @fa-var-cutlery: "\f0f5"; 159 | @fa-var-dashboard: "\f0e4"; 160 | @fa-var-database: "\f1c0"; 161 | @fa-var-dedent: "\f03b"; 162 | @fa-var-delicious: "\f1a5"; 163 | @fa-var-desktop: "\f108"; 164 | @fa-var-deviantart: "\f1bd"; 165 | @fa-var-digg: "\f1a6"; 166 | @fa-var-dollar: "\f155"; 167 | @fa-var-dot-circle-o: "\f192"; 168 | @fa-var-download: "\f019"; 169 | @fa-var-dribbble: "\f17d"; 170 | @fa-var-dropbox: "\f16b"; 171 | @fa-var-drupal: "\f1a9"; 172 | @fa-var-edit: "\f044"; 173 | @fa-var-eject: "\f052"; 174 | @fa-var-ellipsis-h: "\f141"; 175 | @fa-var-ellipsis-v: "\f142"; 176 | @fa-var-empire: "\f1d1"; 177 | @fa-var-envelope: "\f0e0"; 178 | @fa-var-envelope-o: "\f003"; 179 | @fa-var-envelope-square: "\f199"; 180 | @fa-var-eraser: "\f12d"; 181 | @fa-var-eur: "\f153"; 182 | @fa-var-euro: "\f153"; 183 | @fa-var-exchange: "\f0ec"; 184 | @fa-var-exclamation: "\f12a"; 185 | @fa-var-exclamation-circle: "\f06a"; 186 | @fa-var-exclamation-triangle: "\f071"; 187 | @fa-var-expand: "\f065"; 188 | @fa-var-external-link: "\f08e"; 189 | @fa-var-external-link-square: "\f14c"; 190 | @fa-var-eye: "\f06e"; 191 | @fa-var-eye-slash: "\f070"; 192 | @fa-var-eyedropper: "\f1fb"; 193 | @fa-var-facebook: "\f09a"; 194 | @fa-var-facebook-square: "\f082"; 195 | @fa-var-fast-backward: "\f049"; 196 | @fa-var-fast-forward: "\f050"; 197 | @fa-var-fax: "\f1ac"; 198 | @fa-var-female: "\f182"; 199 | @fa-var-fighter-jet: "\f0fb"; 200 | @fa-var-file: "\f15b"; 201 | @fa-var-file-archive-o: "\f1c6"; 202 | @fa-var-file-audio-o: "\f1c7"; 203 | @fa-var-file-code-o: "\f1c9"; 204 | @fa-var-file-excel-o: "\f1c3"; 205 | @fa-var-file-image-o: "\f1c5"; 206 | @fa-var-file-movie-o: "\f1c8"; 207 | @fa-var-file-o: "\f016"; 208 | @fa-var-file-pdf-o: "\f1c1"; 209 | @fa-var-file-photo-o: "\f1c5"; 210 | @fa-var-file-picture-o: "\f1c5"; 211 | @fa-var-file-powerpoint-o: "\f1c4"; 212 | @fa-var-file-sound-o: "\f1c7"; 213 | @fa-var-file-text: "\f15c"; 214 | @fa-var-file-text-o: "\f0f6"; 215 | @fa-var-file-video-o: "\f1c8"; 216 | @fa-var-file-word-o: "\f1c2"; 217 | @fa-var-file-zip-o: "\f1c6"; 218 | @fa-var-files-o: "\f0c5"; 219 | @fa-var-film: "\f008"; 220 | @fa-var-filter: "\f0b0"; 221 | @fa-var-fire: "\f06d"; 222 | @fa-var-fire-extinguisher: "\f134"; 223 | @fa-var-flag: "\f024"; 224 | @fa-var-flag-checkered: "\f11e"; 225 | @fa-var-flag-o: "\f11d"; 226 | @fa-var-flash: "\f0e7"; 227 | @fa-var-flask: "\f0c3"; 228 | @fa-var-flickr: "\f16e"; 229 | @fa-var-floppy-o: "\f0c7"; 230 | @fa-var-folder: "\f07b"; 231 | @fa-var-folder-o: "\f114"; 232 | @fa-var-folder-open: "\f07c"; 233 | @fa-var-folder-open-o: "\f115"; 234 | @fa-var-font: "\f031"; 235 | @fa-var-forward: "\f04e"; 236 | @fa-var-foursquare: "\f180"; 237 | @fa-var-frown-o: "\f119"; 238 | @fa-var-futbol-o: "\f1e3"; 239 | @fa-var-gamepad: "\f11b"; 240 | @fa-var-gavel: "\f0e3"; 241 | @fa-var-gbp: "\f154"; 242 | @fa-var-ge: "\f1d1"; 243 | @fa-var-gear: "\f013"; 244 | @fa-var-gears: "\f085"; 245 | @fa-var-gift: "\f06b"; 246 | @fa-var-git: "\f1d3"; 247 | @fa-var-git-square: "\f1d2"; 248 | @fa-var-github: "\f09b"; 249 | @fa-var-github-alt: "\f113"; 250 | @fa-var-github-square: "\f092"; 251 | @fa-var-gittip: "\f184"; 252 | @fa-var-glass: "\f000"; 253 | @fa-var-globe: "\f0ac"; 254 | @fa-var-google: "\f1a0"; 255 | @fa-var-google-plus: "\f0d5"; 256 | @fa-var-google-plus-square: "\f0d4"; 257 | @fa-var-google-wallet: "\f1ee"; 258 | @fa-var-graduation-cap: "\f19d"; 259 | @fa-var-group: "\f0c0"; 260 | @fa-var-h-square: "\f0fd"; 261 | @fa-var-hacker-news: "\f1d4"; 262 | @fa-var-hand-o-down: "\f0a7"; 263 | @fa-var-hand-o-left: "\f0a5"; 264 | @fa-var-hand-o-right: "\f0a4"; 265 | @fa-var-hand-o-up: "\f0a6"; 266 | @fa-var-hdd-o: "\f0a0"; 267 | @fa-var-header: "\f1dc"; 268 | @fa-var-headphones: "\f025"; 269 | @fa-var-heart: "\f004"; 270 | @fa-var-heart-o: "\f08a"; 271 | @fa-var-history: "\f1da"; 272 | @fa-var-home: "\f015"; 273 | @fa-var-hospital-o: "\f0f8"; 274 | @fa-var-html5: "\f13b"; 275 | @fa-var-ils: "\f20b"; 276 | @fa-var-image: "\f03e"; 277 | @fa-var-inbox: "\f01c"; 278 | @fa-var-indent: "\f03c"; 279 | @fa-var-info: "\f129"; 280 | @fa-var-info-circle: "\f05a"; 281 | @fa-var-inr: "\f156"; 282 | @fa-var-instagram: "\f16d"; 283 | @fa-var-institution: "\f19c"; 284 | @fa-var-ioxhost: "\f208"; 285 | @fa-var-italic: "\f033"; 286 | @fa-var-joomla: "\f1aa"; 287 | @fa-var-jpy: "\f157"; 288 | @fa-var-jsfiddle: "\f1cc"; 289 | @fa-var-key: "\f084"; 290 | @fa-var-keyboard-o: "\f11c"; 291 | @fa-var-krw: "\f159"; 292 | @fa-var-language: "\f1ab"; 293 | @fa-var-laptop: "\f109"; 294 | @fa-var-lastfm: "\f202"; 295 | @fa-var-lastfm-square: "\f203"; 296 | @fa-var-leaf: "\f06c"; 297 | @fa-var-legal: "\f0e3"; 298 | @fa-var-lemon-o: "\f094"; 299 | @fa-var-level-down: "\f149"; 300 | @fa-var-level-up: "\f148"; 301 | @fa-var-life-bouy: "\f1cd"; 302 | @fa-var-life-buoy: "\f1cd"; 303 | @fa-var-life-ring: "\f1cd"; 304 | @fa-var-life-saver: "\f1cd"; 305 | @fa-var-lightbulb-o: "\f0eb"; 306 | @fa-var-line-chart: "\f201"; 307 | @fa-var-link: "\f0c1"; 308 | @fa-var-linkedin: "\f0e1"; 309 | @fa-var-linkedin-square: "\f08c"; 310 | @fa-var-linux: "\f17c"; 311 | @fa-var-list: "\f03a"; 312 | @fa-var-list-alt: "\f022"; 313 | @fa-var-list-ol: "\f0cb"; 314 | @fa-var-list-ul: "\f0ca"; 315 | @fa-var-location-arrow: "\f124"; 316 | @fa-var-lock: "\f023"; 317 | @fa-var-long-arrow-down: "\f175"; 318 | @fa-var-long-arrow-left: "\f177"; 319 | @fa-var-long-arrow-right: "\f178"; 320 | @fa-var-long-arrow-up: "\f176"; 321 | @fa-var-magic: "\f0d0"; 322 | @fa-var-magnet: "\f076"; 323 | @fa-var-mail-forward: "\f064"; 324 | @fa-var-mail-reply: "\f112"; 325 | @fa-var-mail-reply-all: "\f122"; 326 | @fa-var-male: "\f183"; 327 | @fa-var-map-marker: "\f041"; 328 | @fa-var-maxcdn: "\f136"; 329 | @fa-var-meanpath: "\f20c"; 330 | @fa-var-medkit: "\f0fa"; 331 | @fa-var-meh-o: "\f11a"; 332 | @fa-var-microphone: "\f130"; 333 | @fa-var-microphone-slash: "\f131"; 334 | @fa-var-minus: "\f068"; 335 | @fa-var-minus-circle: "\f056"; 336 | @fa-var-minus-square: "\f146"; 337 | @fa-var-minus-square-o: "\f147"; 338 | @fa-var-mobile: "\f10b"; 339 | @fa-var-mobile-phone: "\f10b"; 340 | @fa-var-money: "\f0d6"; 341 | @fa-var-moon-o: "\f186"; 342 | @fa-var-mortar-board: "\f19d"; 343 | @fa-var-music: "\f001"; 344 | @fa-var-navicon: "\f0c9"; 345 | @fa-var-newspaper-o: "\f1ea"; 346 | @fa-var-openid: "\f19b"; 347 | @fa-var-outdent: "\f03b"; 348 | @fa-var-pagelines: "\f18c"; 349 | @fa-var-paint-brush: "\f1fc"; 350 | @fa-var-paper-plane: "\f1d8"; 351 | @fa-var-paper-plane-o: "\f1d9"; 352 | @fa-var-paperclip: "\f0c6"; 353 | @fa-var-paragraph: "\f1dd"; 354 | @fa-var-paste: "\f0ea"; 355 | @fa-var-pause: "\f04c"; 356 | @fa-var-paw: "\f1b0"; 357 | @fa-var-paypal: "\f1ed"; 358 | @fa-var-pencil: "\f040"; 359 | @fa-var-pencil-square: "\f14b"; 360 | @fa-var-pencil-square-o: "\f044"; 361 | @fa-var-phone: "\f095"; 362 | @fa-var-phone-square: "\f098"; 363 | @fa-var-photo: "\f03e"; 364 | @fa-var-picture-o: "\f03e"; 365 | @fa-var-pie-chart: "\f200"; 366 | @fa-var-pied-piper: "\f1a7"; 367 | @fa-var-pied-piper-alt: "\f1a8"; 368 | @fa-var-pinterest: "\f0d2"; 369 | @fa-var-pinterest-square: "\f0d3"; 370 | @fa-var-plane: "\f072"; 371 | @fa-var-play: "\f04b"; 372 | @fa-var-play-circle: "\f144"; 373 | @fa-var-play-circle-o: "\f01d"; 374 | @fa-var-plug: "\f1e6"; 375 | @fa-var-plus: "\f067"; 376 | @fa-var-plus-circle: "\f055"; 377 | @fa-var-plus-square: "\f0fe"; 378 | @fa-var-plus-square-o: "\f196"; 379 | @fa-var-power-off: "\f011"; 380 | @fa-var-print: "\f02f"; 381 | @fa-var-puzzle-piece: "\f12e"; 382 | @fa-var-qq: "\f1d6"; 383 | @fa-var-qrcode: "\f029"; 384 | @fa-var-question: "\f128"; 385 | @fa-var-question-circle: "\f059"; 386 | @fa-var-quote-left: "\f10d"; 387 | @fa-var-quote-right: "\f10e"; 388 | @fa-var-ra: "\f1d0"; 389 | @fa-var-random: "\f074"; 390 | @fa-var-rebel: "\f1d0"; 391 | @fa-var-recycle: "\f1b8"; 392 | @fa-var-reddit: "\f1a1"; 393 | @fa-var-reddit-square: "\f1a2"; 394 | @fa-var-refresh: "\f021"; 395 | @fa-var-remove: "\f00d"; 396 | @fa-var-renren: "\f18b"; 397 | @fa-var-reorder: "\f0c9"; 398 | @fa-var-repeat: "\f01e"; 399 | @fa-var-reply: "\f112"; 400 | @fa-var-reply-all: "\f122"; 401 | @fa-var-retweet: "\f079"; 402 | @fa-var-rmb: "\f157"; 403 | @fa-var-road: "\f018"; 404 | @fa-var-rocket: "\f135"; 405 | @fa-var-rotate-left: "\f0e2"; 406 | @fa-var-rotate-right: "\f01e"; 407 | @fa-var-rouble: "\f158"; 408 | @fa-var-rss: "\f09e"; 409 | @fa-var-rss-square: "\f143"; 410 | @fa-var-rub: "\f158"; 411 | @fa-var-ruble: "\f158"; 412 | @fa-var-rupee: "\f156"; 413 | @fa-var-save: "\f0c7"; 414 | @fa-var-scissors: "\f0c4"; 415 | @fa-var-search: "\f002"; 416 | @fa-var-search-minus: "\f010"; 417 | @fa-var-search-plus: "\f00e"; 418 | @fa-var-send: "\f1d8"; 419 | @fa-var-send-o: "\f1d9"; 420 | @fa-var-share: "\f064"; 421 | @fa-var-share-alt: "\f1e0"; 422 | @fa-var-share-alt-square: "\f1e1"; 423 | @fa-var-share-square: "\f14d"; 424 | @fa-var-share-square-o: "\f045"; 425 | @fa-var-shekel: "\f20b"; 426 | @fa-var-sheqel: "\f20b"; 427 | @fa-var-shield: "\f132"; 428 | @fa-var-shopping-cart: "\f07a"; 429 | @fa-var-sign-in: "\f090"; 430 | @fa-var-sign-out: "\f08b"; 431 | @fa-var-signal: "\f012"; 432 | @fa-var-sitemap: "\f0e8"; 433 | @fa-var-skype: "\f17e"; 434 | @fa-var-slack: "\f198"; 435 | @fa-var-sliders: "\f1de"; 436 | @fa-var-slideshare: "\f1e7"; 437 | @fa-var-smile-o: "\f118"; 438 | @fa-var-soccer-ball-o: "\f1e3"; 439 | @fa-var-sort: "\f0dc"; 440 | @fa-var-sort-alpha-asc: "\f15d"; 441 | @fa-var-sort-alpha-desc: "\f15e"; 442 | @fa-var-sort-amount-asc: "\f160"; 443 | @fa-var-sort-amount-desc: "\f161"; 444 | @fa-var-sort-asc: "\f0de"; 445 | @fa-var-sort-desc: "\f0dd"; 446 | @fa-var-sort-down: "\f0dd"; 447 | @fa-var-sort-numeric-asc: "\f162"; 448 | @fa-var-sort-numeric-desc: "\f163"; 449 | @fa-var-sort-up: "\f0de"; 450 | @fa-var-soundcloud: "\f1be"; 451 | @fa-var-space-shuttle: "\f197"; 452 | @fa-var-spinner: "\f110"; 453 | @fa-var-spoon: "\f1b1"; 454 | @fa-var-spotify: "\f1bc"; 455 | @fa-var-square: "\f0c8"; 456 | @fa-var-square-o: "\f096"; 457 | @fa-var-stack-exchange: "\f18d"; 458 | @fa-var-stack-overflow: "\f16c"; 459 | @fa-var-star: "\f005"; 460 | @fa-var-star-half: "\f089"; 461 | @fa-var-star-half-empty: "\f123"; 462 | @fa-var-star-half-full: "\f123"; 463 | @fa-var-star-half-o: "\f123"; 464 | @fa-var-star-o: "\f006"; 465 | @fa-var-steam: "\f1b6"; 466 | @fa-var-steam-square: "\f1b7"; 467 | @fa-var-step-backward: "\f048"; 468 | @fa-var-step-forward: "\f051"; 469 | @fa-var-stethoscope: "\f0f1"; 470 | @fa-var-stop: "\f04d"; 471 | @fa-var-strikethrough: "\f0cc"; 472 | @fa-var-stumbleupon: "\f1a4"; 473 | @fa-var-stumbleupon-circle: "\f1a3"; 474 | @fa-var-subscript: "\f12c"; 475 | @fa-var-suitcase: "\f0f2"; 476 | @fa-var-sun-o: "\f185"; 477 | @fa-var-superscript: "\f12b"; 478 | @fa-var-support: "\f1cd"; 479 | @fa-var-table: "\f0ce"; 480 | @fa-var-tablet: "\f10a"; 481 | @fa-var-tachometer: "\f0e4"; 482 | @fa-var-tag: "\f02b"; 483 | @fa-var-tags: "\f02c"; 484 | @fa-var-tasks: "\f0ae"; 485 | @fa-var-taxi: "\f1ba"; 486 | @fa-var-tencent-weibo: "\f1d5"; 487 | @fa-var-terminal: "\f120"; 488 | @fa-var-text-height: "\f034"; 489 | @fa-var-text-width: "\f035"; 490 | @fa-var-th: "\f00a"; 491 | @fa-var-th-large: "\f009"; 492 | @fa-var-th-list: "\f00b"; 493 | @fa-var-thumb-tack: "\f08d"; 494 | @fa-var-thumbs-down: "\f165"; 495 | @fa-var-thumbs-o-down: "\f088"; 496 | @fa-var-thumbs-o-up: "\f087"; 497 | @fa-var-thumbs-up: "\f164"; 498 | @fa-var-ticket: "\f145"; 499 | @fa-var-times: "\f00d"; 500 | @fa-var-times-circle: "\f057"; 501 | @fa-var-times-circle-o: "\f05c"; 502 | @fa-var-tint: "\f043"; 503 | @fa-var-toggle-down: "\f150"; 504 | @fa-var-toggle-left: "\f191"; 505 | @fa-var-toggle-off: "\f204"; 506 | @fa-var-toggle-on: "\f205"; 507 | @fa-var-toggle-right: "\f152"; 508 | @fa-var-toggle-up: "\f151"; 509 | @fa-var-trash: "\f1f8"; 510 | @fa-var-trash-o: "\f014"; 511 | @fa-var-tree: "\f1bb"; 512 | @fa-var-trello: "\f181"; 513 | @fa-var-trophy: "\f091"; 514 | @fa-var-truck: "\f0d1"; 515 | @fa-var-try: "\f195"; 516 | @fa-var-tty: "\f1e4"; 517 | @fa-var-tumblr: "\f173"; 518 | @fa-var-tumblr-square: "\f174"; 519 | @fa-var-turkish-lira: "\f195"; 520 | @fa-var-twitch: "\f1e8"; 521 | @fa-var-twitter: "\f099"; 522 | @fa-var-twitter-square: "\f081"; 523 | @fa-var-umbrella: "\f0e9"; 524 | @fa-var-underline: "\f0cd"; 525 | @fa-var-undo: "\f0e2"; 526 | @fa-var-university: "\f19c"; 527 | @fa-var-unlink: "\f127"; 528 | @fa-var-unlock: "\f09c"; 529 | @fa-var-unlock-alt: "\f13e"; 530 | @fa-var-unsorted: "\f0dc"; 531 | @fa-var-upload: "\f093"; 532 | @fa-var-usd: "\f155"; 533 | @fa-var-user: "\f007"; 534 | @fa-var-user-md: "\f0f0"; 535 | @fa-var-users: "\f0c0"; 536 | @fa-var-video-camera: "\f03d"; 537 | @fa-var-vimeo-square: "\f194"; 538 | @fa-var-vine: "\f1ca"; 539 | @fa-var-vk: "\f189"; 540 | @fa-var-volume-down: "\f027"; 541 | @fa-var-volume-off: "\f026"; 542 | @fa-var-volume-up: "\f028"; 543 | @fa-var-warning: "\f071"; 544 | @fa-var-wechat: "\f1d7"; 545 | @fa-var-weibo: "\f18a"; 546 | @fa-var-weixin: "\f1d7"; 547 | @fa-var-wheelchair: "\f193"; 548 | @fa-var-wifi: "\f1eb"; 549 | @fa-var-windows: "\f17a"; 550 | @fa-var-won: "\f159"; 551 | @fa-var-wordpress: "\f19a"; 552 | @fa-var-wrench: "\f0ad"; 553 | @fa-var-xing: "\f168"; 554 | @fa-var-xing-square: "\f169"; 555 | @fa-var-yahoo: "\f19e"; 556 | @fa-var-yelp: "\f1e9"; 557 | @fa-var-yen: "\f157"; 558 | @fa-var-youtube: "\f167"; 559 | @fa-var-youtube-play: "\f16a"; 560 | @fa-var-youtube-square: "\f166"; 561 | 562 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .pull-right { float: right; } 11 | .pull-left { float: left; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.pull-left { margin-right: .3em; } 15 | &.pull-right { margin-left: .3em; } 16 | } 17 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | 13 | @mixin fa-icon-rotate($degrees, $rotation) { 14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 15 | -webkit-transform: rotate($degrees); 16 | -ms-transform: rotate($degrees); 17 | transform: rotate($degrees); 18 | } 19 | 20 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 21 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 22 | -webkit-transform: scale($horiz, $vert); 23 | -ms-transform: scale($horiz, $vert); 24 | transform: scale($horiz, $vert); 25 | } 26 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 9 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 10 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 11 | //src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/scss/_spinning.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | @-webkit-keyframes fa-spin { 10 | 0% { 11 | -webkit-transform: rotate(0deg); 12 | transform: rotate(0deg); 13 | } 14 | 100% { 15 | -webkit-transform: rotate(359deg); 16 | transform: rotate(359deg); 17 | } 18 | } 19 | 20 | @keyframes fa-spin { 21 | 0% { 22 | -webkit-transform: rotate(0deg); 23 | transform: rotate(0deg); 24 | } 25 | 100% { 26 | -webkit-transform: rotate(359deg); 27 | transform: rotate(359deg); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | // -------------------------- 3 | 4 | $fa-font-path: "../fonts" !default; 5 | //$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts" !default; // for referencing Bootstrap CDN font files directly 6 | $fa-css-prefix: fa !default; 7 | $fa-version: "4.2.0" !default; 8 | $fa-border-color: #eee !default; 9 | $fa-inverse: #fff !default; 10 | $fa-li-width: (30em / 14) !default; 11 | 12 | $fa-var-adjust: "\f042"; 13 | $fa-var-adn: "\f170"; 14 | $fa-var-align-center: "\f037"; 15 | $fa-var-align-justify: "\f039"; 16 | $fa-var-align-left: "\f036"; 17 | $fa-var-align-right: "\f038"; 18 | $fa-var-ambulance: "\f0f9"; 19 | $fa-var-anchor: "\f13d"; 20 | $fa-var-android: "\f17b"; 21 | $fa-var-angellist: "\f209"; 22 | $fa-var-angle-double-down: "\f103"; 23 | $fa-var-angle-double-left: "\f100"; 24 | $fa-var-angle-double-right: "\f101"; 25 | $fa-var-angle-double-up: "\f102"; 26 | $fa-var-angle-down: "\f107"; 27 | $fa-var-angle-left: "\f104"; 28 | $fa-var-angle-right: "\f105"; 29 | $fa-var-angle-up: "\f106"; 30 | $fa-var-apple: "\f179"; 31 | $fa-var-archive: "\f187"; 32 | $fa-var-area-chart: "\f1fe"; 33 | $fa-var-arrow-circle-down: "\f0ab"; 34 | $fa-var-arrow-circle-left: "\f0a8"; 35 | $fa-var-arrow-circle-o-down: "\f01a"; 36 | $fa-var-arrow-circle-o-left: "\f190"; 37 | $fa-var-arrow-circle-o-right: "\f18e"; 38 | $fa-var-arrow-circle-o-up: "\f01b"; 39 | $fa-var-arrow-circle-right: "\f0a9"; 40 | $fa-var-arrow-circle-up: "\f0aa"; 41 | $fa-var-arrow-down: "\f063"; 42 | $fa-var-arrow-left: "\f060"; 43 | $fa-var-arrow-right: "\f061"; 44 | $fa-var-arrow-up: "\f062"; 45 | $fa-var-arrows: "\f047"; 46 | $fa-var-arrows-alt: "\f0b2"; 47 | $fa-var-arrows-h: "\f07e"; 48 | $fa-var-arrows-v: "\f07d"; 49 | $fa-var-asterisk: "\f069"; 50 | $fa-var-at: "\f1fa"; 51 | $fa-var-automobile: "\f1b9"; 52 | $fa-var-backward: "\f04a"; 53 | $fa-var-ban: "\f05e"; 54 | $fa-var-bank: "\f19c"; 55 | $fa-var-bar-chart: "\f080"; 56 | $fa-var-bar-chart-o: "\f080"; 57 | $fa-var-barcode: "\f02a"; 58 | $fa-var-bars: "\f0c9"; 59 | $fa-var-beer: "\f0fc"; 60 | $fa-var-behance: "\f1b4"; 61 | $fa-var-behance-square: "\f1b5"; 62 | $fa-var-bell: "\f0f3"; 63 | $fa-var-bell-o: "\f0a2"; 64 | $fa-var-bell-slash: "\f1f6"; 65 | $fa-var-bell-slash-o: "\f1f7"; 66 | $fa-var-bicycle: "\f206"; 67 | $fa-var-binoculars: "\f1e5"; 68 | $fa-var-birthday-cake: "\f1fd"; 69 | $fa-var-bitbucket: "\f171"; 70 | $fa-var-bitbucket-square: "\f172"; 71 | $fa-var-bitcoin: "\f15a"; 72 | $fa-var-bold: "\f032"; 73 | $fa-var-bolt: "\f0e7"; 74 | $fa-var-bomb: "\f1e2"; 75 | $fa-var-book: "\f02d"; 76 | $fa-var-bookmark: "\f02e"; 77 | $fa-var-bookmark-o: "\f097"; 78 | $fa-var-briefcase: "\f0b1"; 79 | $fa-var-btc: "\f15a"; 80 | $fa-var-bug: "\f188"; 81 | $fa-var-building: "\f1ad"; 82 | $fa-var-building-o: "\f0f7"; 83 | $fa-var-bullhorn: "\f0a1"; 84 | $fa-var-bullseye: "\f140"; 85 | $fa-var-bus: "\f207"; 86 | $fa-var-cab: "\f1ba"; 87 | $fa-var-calculator: "\f1ec"; 88 | $fa-var-calendar: "\f073"; 89 | $fa-var-calendar-o: "\f133"; 90 | $fa-var-camera: "\f030"; 91 | $fa-var-camera-retro: "\f083"; 92 | $fa-var-car: "\f1b9"; 93 | $fa-var-caret-down: "\f0d7"; 94 | $fa-var-caret-left: "\f0d9"; 95 | $fa-var-caret-right: "\f0da"; 96 | $fa-var-caret-square-o-down: "\f150"; 97 | $fa-var-caret-square-o-left: "\f191"; 98 | $fa-var-caret-square-o-right: "\f152"; 99 | $fa-var-caret-square-o-up: "\f151"; 100 | $fa-var-caret-up: "\f0d8"; 101 | $fa-var-cc: "\f20a"; 102 | $fa-var-cc-amex: "\f1f3"; 103 | $fa-var-cc-discover: "\f1f2"; 104 | $fa-var-cc-mastercard: "\f1f1"; 105 | $fa-var-cc-paypal: "\f1f4"; 106 | $fa-var-cc-stripe: "\f1f5"; 107 | $fa-var-cc-visa: "\f1f0"; 108 | $fa-var-certificate: "\f0a3"; 109 | $fa-var-chain: "\f0c1"; 110 | $fa-var-chain-broken: "\f127"; 111 | $fa-var-check: "\f00c"; 112 | $fa-var-check-circle: "\f058"; 113 | $fa-var-check-circle-o: "\f05d"; 114 | $fa-var-check-square: "\f14a"; 115 | $fa-var-check-square-o: "\f046"; 116 | $fa-var-chevron-circle-down: "\f13a"; 117 | $fa-var-chevron-circle-left: "\f137"; 118 | $fa-var-chevron-circle-right: "\f138"; 119 | $fa-var-chevron-circle-up: "\f139"; 120 | $fa-var-chevron-down: "\f078"; 121 | $fa-var-chevron-left: "\f053"; 122 | $fa-var-chevron-right: "\f054"; 123 | $fa-var-chevron-up: "\f077"; 124 | $fa-var-child: "\f1ae"; 125 | $fa-var-circle: "\f111"; 126 | $fa-var-circle-o: "\f10c"; 127 | $fa-var-circle-o-notch: "\f1ce"; 128 | $fa-var-circle-thin: "\f1db"; 129 | $fa-var-clipboard: "\f0ea"; 130 | $fa-var-clock-o: "\f017"; 131 | $fa-var-close: "\f00d"; 132 | $fa-var-cloud: "\f0c2"; 133 | $fa-var-cloud-download: "\f0ed"; 134 | $fa-var-cloud-upload: "\f0ee"; 135 | $fa-var-cny: "\f157"; 136 | $fa-var-code: "\f121"; 137 | $fa-var-code-fork: "\f126"; 138 | $fa-var-codepen: "\f1cb"; 139 | $fa-var-coffee: "\f0f4"; 140 | $fa-var-cog: "\f013"; 141 | $fa-var-cogs: "\f085"; 142 | $fa-var-columns: "\f0db"; 143 | $fa-var-comment: "\f075"; 144 | $fa-var-comment-o: "\f0e5"; 145 | $fa-var-comments: "\f086"; 146 | $fa-var-comments-o: "\f0e6"; 147 | $fa-var-compass: "\f14e"; 148 | $fa-var-compress: "\f066"; 149 | $fa-var-copy: "\f0c5"; 150 | $fa-var-copyright: "\f1f9"; 151 | $fa-var-credit-card: "\f09d"; 152 | $fa-var-crop: "\f125"; 153 | $fa-var-crosshairs: "\f05b"; 154 | $fa-var-css3: "\f13c"; 155 | $fa-var-cube: "\f1b2"; 156 | $fa-var-cubes: "\f1b3"; 157 | $fa-var-cut: "\f0c4"; 158 | $fa-var-cutlery: "\f0f5"; 159 | $fa-var-dashboard: "\f0e4"; 160 | $fa-var-database: "\f1c0"; 161 | $fa-var-dedent: "\f03b"; 162 | $fa-var-delicious: "\f1a5"; 163 | $fa-var-desktop: "\f108"; 164 | $fa-var-deviantart: "\f1bd"; 165 | $fa-var-digg: "\f1a6"; 166 | $fa-var-dollar: "\f155"; 167 | $fa-var-dot-circle-o: "\f192"; 168 | $fa-var-download: "\f019"; 169 | $fa-var-dribbble: "\f17d"; 170 | $fa-var-dropbox: "\f16b"; 171 | $fa-var-drupal: "\f1a9"; 172 | $fa-var-edit: "\f044"; 173 | $fa-var-eject: "\f052"; 174 | $fa-var-ellipsis-h: "\f141"; 175 | $fa-var-ellipsis-v: "\f142"; 176 | $fa-var-empire: "\f1d1"; 177 | $fa-var-envelope: "\f0e0"; 178 | $fa-var-envelope-o: "\f003"; 179 | $fa-var-envelope-square: "\f199"; 180 | $fa-var-eraser: "\f12d"; 181 | $fa-var-eur: "\f153"; 182 | $fa-var-euro: "\f153"; 183 | $fa-var-exchange: "\f0ec"; 184 | $fa-var-exclamation: "\f12a"; 185 | $fa-var-exclamation-circle: "\f06a"; 186 | $fa-var-exclamation-triangle: "\f071"; 187 | $fa-var-expand: "\f065"; 188 | $fa-var-external-link: "\f08e"; 189 | $fa-var-external-link-square: "\f14c"; 190 | $fa-var-eye: "\f06e"; 191 | $fa-var-eye-slash: "\f070"; 192 | $fa-var-eyedropper: "\f1fb"; 193 | $fa-var-facebook: "\f09a"; 194 | $fa-var-facebook-square: "\f082"; 195 | $fa-var-fast-backward: "\f049"; 196 | $fa-var-fast-forward: "\f050"; 197 | $fa-var-fax: "\f1ac"; 198 | $fa-var-female: "\f182"; 199 | $fa-var-fighter-jet: "\f0fb"; 200 | $fa-var-file: "\f15b"; 201 | $fa-var-file-archive-o: "\f1c6"; 202 | $fa-var-file-audio-o: "\f1c7"; 203 | $fa-var-file-code-o: "\f1c9"; 204 | $fa-var-file-excel-o: "\f1c3"; 205 | $fa-var-file-image-o: "\f1c5"; 206 | $fa-var-file-movie-o: "\f1c8"; 207 | $fa-var-file-o: "\f016"; 208 | $fa-var-file-pdf-o: "\f1c1"; 209 | $fa-var-file-photo-o: "\f1c5"; 210 | $fa-var-file-picture-o: "\f1c5"; 211 | $fa-var-file-powerpoint-o: "\f1c4"; 212 | $fa-var-file-sound-o: "\f1c7"; 213 | $fa-var-file-text: "\f15c"; 214 | $fa-var-file-text-o: "\f0f6"; 215 | $fa-var-file-video-o: "\f1c8"; 216 | $fa-var-file-word-o: "\f1c2"; 217 | $fa-var-file-zip-o: "\f1c6"; 218 | $fa-var-files-o: "\f0c5"; 219 | $fa-var-film: "\f008"; 220 | $fa-var-filter: "\f0b0"; 221 | $fa-var-fire: "\f06d"; 222 | $fa-var-fire-extinguisher: "\f134"; 223 | $fa-var-flag: "\f024"; 224 | $fa-var-flag-checkered: "\f11e"; 225 | $fa-var-flag-o: "\f11d"; 226 | $fa-var-flash: "\f0e7"; 227 | $fa-var-flask: "\f0c3"; 228 | $fa-var-flickr: "\f16e"; 229 | $fa-var-floppy-o: "\f0c7"; 230 | $fa-var-folder: "\f07b"; 231 | $fa-var-folder-o: "\f114"; 232 | $fa-var-folder-open: "\f07c"; 233 | $fa-var-folder-open-o: "\f115"; 234 | $fa-var-font: "\f031"; 235 | $fa-var-forward: "\f04e"; 236 | $fa-var-foursquare: "\f180"; 237 | $fa-var-frown-o: "\f119"; 238 | $fa-var-futbol-o: "\f1e3"; 239 | $fa-var-gamepad: "\f11b"; 240 | $fa-var-gavel: "\f0e3"; 241 | $fa-var-gbp: "\f154"; 242 | $fa-var-ge: "\f1d1"; 243 | $fa-var-gear: "\f013"; 244 | $fa-var-gears: "\f085"; 245 | $fa-var-gift: "\f06b"; 246 | $fa-var-git: "\f1d3"; 247 | $fa-var-git-square: "\f1d2"; 248 | $fa-var-github: "\f09b"; 249 | $fa-var-github-alt: "\f113"; 250 | $fa-var-github-square: "\f092"; 251 | $fa-var-gittip: "\f184"; 252 | $fa-var-glass: "\f000"; 253 | $fa-var-globe: "\f0ac"; 254 | $fa-var-google: "\f1a0"; 255 | $fa-var-google-plus: "\f0d5"; 256 | $fa-var-google-plus-square: "\f0d4"; 257 | $fa-var-google-wallet: "\f1ee"; 258 | $fa-var-graduation-cap: "\f19d"; 259 | $fa-var-group: "\f0c0"; 260 | $fa-var-h-square: "\f0fd"; 261 | $fa-var-hacker-news: "\f1d4"; 262 | $fa-var-hand-o-down: "\f0a7"; 263 | $fa-var-hand-o-left: "\f0a5"; 264 | $fa-var-hand-o-right: "\f0a4"; 265 | $fa-var-hand-o-up: "\f0a6"; 266 | $fa-var-hdd-o: "\f0a0"; 267 | $fa-var-header: "\f1dc"; 268 | $fa-var-headphones: "\f025"; 269 | $fa-var-heart: "\f004"; 270 | $fa-var-heart-o: "\f08a"; 271 | $fa-var-history: "\f1da"; 272 | $fa-var-home: "\f015"; 273 | $fa-var-hospital-o: "\f0f8"; 274 | $fa-var-html5: "\f13b"; 275 | $fa-var-ils: "\f20b"; 276 | $fa-var-image: "\f03e"; 277 | $fa-var-inbox: "\f01c"; 278 | $fa-var-indent: "\f03c"; 279 | $fa-var-info: "\f129"; 280 | $fa-var-info-circle: "\f05a"; 281 | $fa-var-inr: "\f156"; 282 | $fa-var-instagram: "\f16d"; 283 | $fa-var-institution: "\f19c"; 284 | $fa-var-ioxhost: "\f208"; 285 | $fa-var-italic: "\f033"; 286 | $fa-var-joomla: "\f1aa"; 287 | $fa-var-jpy: "\f157"; 288 | $fa-var-jsfiddle: "\f1cc"; 289 | $fa-var-key: "\f084"; 290 | $fa-var-keyboard-o: "\f11c"; 291 | $fa-var-krw: "\f159"; 292 | $fa-var-language: "\f1ab"; 293 | $fa-var-laptop: "\f109"; 294 | $fa-var-lastfm: "\f202"; 295 | $fa-var-lastfm-square: "\f203"; 296 | $fa-var-leaf: "\f06c"; 297 | $fa-var-legal: "\f0e3"; 298 | $fa-var-lemon-o: "\f094"; 299 | $fa-var-level-down: "\f149"; 300 | $fa-var-level-up: "\f148"; 301 | $fa-var-life-bouy: "\f1cd"; 302 | $fa-var-life-buoy: "\f1cd"; 303 | $fa-var-life-ring: "\f1cd"; 304 | $fa-var-life-saver: "\f1cd"; 305 | $fa-var-lightbulb-o: "\f0eb"; 306 | $fa-var-line-chart: "\f201"; 307 | $fa-var-link: "\f0c1"; 308 | $fa-var-linkedin: "\f0e1"; 309 | $fa-var-linkedin-square: "\f08c"; 310 | $fa-var-linux: "\f17c"; 311 | $fa-var-list: "\f03a"; 312 | $fa-var-list-alt: "\f022"; 313 | $fa-var-list-ol: "\f0cb"; 314 | $fa-var-list-ul: "\f0ca"; 315 | $fa-var-location-arrow: "\f124"; 316 | $fa-var-lock: "\f023"; 317 | $fa-var-long-arrow-down: "\f175"; 318 | $fa-var-long-arrow-left: "\f177"; 319 | $fa-var-long-arrow-right: "\f178"; 320 | $fa-var-long-arrow-up: "\f176"; 321 | $fa-var-magic: "\f0d0"; 322 | $fa-var-magnet: "\f076"; 323 | $fa-var-mail-forward: "\f064"; 324 | $fa-var-mail-reply: "\f112"; 325 | $fa-var-mail-reply-all: "\f122"; 326 | $fa-var-male: "\f183"; 327 | $fa-var-map-marker: "\f041"; 328 | $fa-var-maxcdn: "\f136"; 329 | $fa-var-meanpath: "\f20c"; 330 | $fa-var-medkit: "\f0fa"; 331 | $fa-var-meh-o: "\f11a"; 332 | $fa-var-microphone: "\f130"; 333 | $fa-var-microphone-slash: "\f131"; 334 | $fa-var-minus: "\f068"; 335 | $fa-var-minus-circle: "\f056"; 336 | $fa-var-minus-square: "\f146"; 337 | $fa-var-minus-square-o: "\f147"; 338 | $fa-var-mobile: "\f10b"; 339 | $fa-var-mobile-phone: "\f10b"; 340 | $fa-var-money: "\f0d6"; 341 | $fa-var-moon-o: "\f186"; 342 | $fa-var-mortar-board: "\f19d"; 343 | $fa-var-music: "\f001"; 344 | $fa-var-navicon: "\f0c9"; 345 | $fa-var-newspaper-o: "\f1ea"; 346 | $fa-var-openid: "\f19b"; 347 | $fa-var-outdent: "\f03b"; 348 | $fa-var-pagelines: "\f18c"; 349 | $fa-var-paint-brush: "\f1fc"; 350 | $fa-var-paper-plane: "\f1d8"; 351 | $fa-var-paper-plane-o: "\f1d9"; 352 | $fa-var-paperclip: "\f0c6"; 353 | $fa-var-paragraph: "\f1dd"; 354 | $fa-var-paste: "\f0ea"; 355 | $fa-var-pause: "\f04c"; 356 | $fa-var-paw: "\f1b0"; 357 | $fa-var-paypal: "\f1ed"; 358 | $fa-var-pencil: "\f040"; 359 | $fa-var-pencil-square: "\f14b"; 360 | $fa-var-pencil-square-o: "\f044"; 361 | $fa-var-phone: "\f095"; 362 | $fa-var-phone-square: "\f098"; 363 | $fa-var-photo: "\f03e"; 364 | $fa-var-picture-o: "\f03e"; 365 | $fa-var-pie-chart: "\f200"; 366 | $fa-var-pied-piper: "\f1a7"; 367 | $fa-var-pied-piper-alt: "\f1a8"; 368 | $fa-var-pinterest: "\f0d2"; 369 | $fa-var-pinterest-square: "\f0d3"; 370 | $fa-var-plane: "\f072"; 371 | $fa-var-play: "\f04b"; 372 | $fa-var-play-circle: "\f144"; 373 | $fa-var-play-circle-o: "\f01d"; 374 | $fa-var-plug: "\f1e6"; 375 | $fa-var-plus: "\f067"; 376 | $fa-var-plus-circle: "\f055"; 377 | $fa-var-plus-square: "\f0fe"; 378 | $fa-var-plus-square-o: "\f196"; 379 | $fa-var-power-off: "\f011"; 380 | $fa-var-print: "\f02f"; 381 | $fa-var-puzzle-piece: "\f12e"; 382 | $fa-var-qq: "\f1d6"; 383 | $fa-var-qrcode: "\f029"; 384 | $fa-var-question: "\f128"; 385 | $fa-var-question-circle: "\f059"; 386 | $fa-var-quote-left: "\f10d"; 387 | $fa-var-quote-right: "\f10e"; 388 | $fa-var-ra: "\f1d0"; 389 | $fa-var-random: "\f074"; 390 | $fa-var-rebel: "\f1d0"; 391 | $fa-var-recycle: "\f1b8"; 392 | $fa-var-reddit: "\f1a1"; 393 | $fa-var-reddit-square: "\f1a2"; 394 | $fa-var-refresh: "\f021"; 395 | $fa-var-remove: "\f00d"; 396 | $fa-var-renren: "\f18b"; 397 | $fa-var-reorder: "\f0c9"; 398 | $fa-var-repeat: "\f01e"; 399 | $fa-var-reply: "\f112"; 400 | $fa-var-reply-all: "\f122"; 401 | $fa-var-retweet: "\f079"; 402 | $fa-var-rmb: "\f157"; 403 | $fa-var-road: "\f018"; 404 | $fa-var-rocket: "\f135"; 405 | $fa-var-rotate-left: "\f0e2"; 406 | $fa-var-rotate-right: "\f01e"; 407 | $fa-var-rouble: "\f158"; 408 | $fa-var-rss: "\f09e"; 409 | $fa-var-rss-square: "\f143"; 410 | $fa-var-rub: "\f158"; 411 | $fa-var-ruble: "\f158"; 412 | $fa-var-rupee: "\f156"; 413 | $fa-var-save: "\f0c7"; 414 | $fa-var-scissors: "\f0c4"; 415 | $fa-var-search: "\f002"; 416 | $fa-var-search-minus: "\f010"; 417 | $fa-var-search-plus: "\f00e"; 418 | $fa-var-send: "\f1d8"; 419 | $fa-var-send-o: "\f1d9"; 420 | $fa-var-share: "\f064"; 421 | $fa-var-share-alt: "\f1e0"; 422 | $fa-var-share-alt-square: "\f1e1"; 423 | $fa-var-share-square: "\f14d"; 424 | $fa-var-share-square-o: "\f045"; 425 | $fa-var-shekel: "\f20b"; 426 | $fa-var-sheqel: "\f20b"; 427 | $fa-var-shield: "\f132"; 428 | $fa-var-shopping-cart: "\f07a"; 429 | $fa-var-sign-in: "\f090"; 430 | $fa-var-sign-out: "\f08b"; 431 | $fa-var-signal: "\f012"; 432 | $fa-var-sitemap: "\f0e8"; 433 | $fa-var-skype: "\f17e"; 434 | $fa-var-slack: "\f198"; 435 | $fa-var-sliders: "\f1de"; 436 | $fa-var-slideshare: "\f1e7"; 437 | $fa-var-smile-o: "\f118"; 438 | $fa-var-soccer-ball-o: "\f1e3"; 439 | $fa-var-sort: "\f0dc"; 440 | $fa-var-sort-alpha-asc: "\f15d"; 441 | $fa-var-sort-alpha-desc: "\f15e"; 442 | $fa-var-sort-amount-asc: "\f160"; 443 | $fa-var-sort-amount-desc: "\f161"; 444 | $fa-var-sort-asc: "\f0de"; 445 | $fa-var-sort-desc: "\f0dd"; 446 | $fa-var-sort-down: "\f0dd"; 447 | $fa-var-sort-numeric-asc: "\f162"; 448 | $fa-var-sort-numeric-desc: "\f163"; 449 | $fa-var-sort-up: "\f0de"; 450 | $fa-var-soundcloud: "\f1be"; 451 | $fa-var-space-shuttle: "\f197"; 452 | $fa-var-spinner: "\f110"; 453 | $fa-var-spoon: "\f1b1"; 454 | $fa-var-spotify: "\f1bc"; 455 | $fa-var-square: "\f0c8"; 456 | $fa-var-square-o: "\f096"; 457 | $fa-var-stack-exchange: "\f18d"; 458 | $fa-var-stack-overflow: "\f16c"; 459 | $fa-var-star: "\f005"; 460 | $fa-var-star-half: "\f089"; 461 | $fa-var-star-half-empty: "\f123"; 462 | $fa-var-star-half-full: "\f123"; 463 | $fa-var-star-half-o: "\f123"; 464 | $fa-var-star-o: "\f006"; 465 | $fa-var-steam: "\f1b6"; 466 | $fa-var-steam-square: "\f1b7"; 467 | $fa-var-step-backward: "\f048"; 468 | $fa-var-step-forward: "\f051"; 469 | $fa-var-stethoscope: "\f0f1"; 470 | $fa-var-stop: "\f04d"; 471 | $fa-var-strikethrough: "\f0cc"; 472 | $fa-var-stumbleupon: "\f1a4"; 473 | $fa-var-stumbleupon-circle: "\f1a3"; 474 | $fa-var-subscript: "\f12c"; 475 | $fa-var-suitcase: "\f0f2"; 476 | $fa-var-sun-o: "\f185"; 477 | $fa-var-superscript: "\f12b"; 478 | $fa-var-support: "\f1cd"; 479 | $fa-var-table: "\f0ce"; 480 | $fa-var-tablet: "\f10a"; 481 | $fa-var-tachometer: "\f0e4"; 482 | $fa-var-tag: "\f02b"; 483 | $fa-var-tags: "\f02c"; 484 | $fa-var-tasks: "\f0ae"; 485 | $fa-var-taxi: "\f1ba"; 486 | $fa-var-tencent-weibo: "\f1d5"; 487 | $fa-var-terminal: "\f120"; 488 | $fa-var-text-height: "\f034"; 489 | $fa-var-text-width: "\f035"; 490 | $fa-var-th: "\f00a"; 491 | $fa-var-th-large: "\f009"; 492 | $fa-var-th-list: "\f00b"; 493 | $fa-var-thumb-tack: "\f08d"; 494 | $fa-var-thumbs-down: "\f165"; 495 | $fa-var-thumbs-o-down: "\f088"; 496 | $fa-var-thumbs-o-up: "\f087"; 497 | $fa-var-thumbs-up: "\f164"; 498 | $fa-var-ticket: "\f145"; 499 | $fa-var-times: "\f00d"; 500 | $fa-var-times-circle: "\f057"; 501 | $fa-var-times-circle-o: "\f05c"; 502 | $fa-var-tint: "\f043"; 503 | $fa-var-toggle-down: "\f150"; 504 | $fa-var-toggle-left: "\f191"; 505 | $fa-var-toggle-off: "\f204"; 506 | $fa-var-toggle-on: "\f205"; 507 | $fa-var-toggle-right: "\f152"; 508 | $fa-var-toggle-up: "\f151"; 509 | $fa-var-trash: "\f1f8"; 510 | $fa-var-trash-o: "\f014"; 511 | $fa-var-tree: "\f1bb"; 512 | $fa-var-trello: "\f181"; 513 | $fa-var-trophy: "\f091"; 514 | $fa-var-truck: "\f0d1"; 515 | $fa-var-try: "\f195"; 516 | $fa-var-tty: "\f1e4"; 517 | $fa-var-tumblr: "\f173"; 518 | $fa-var-tumblr-square: "\f174"; 519 | $fa-var-turkish-lira: "\f195"; 520 | $fa-var-twitch: "\f1e8"; 521 | $fa-var-twitter: "\f099"; 522 | $fa-var-twitter-square: "\f081"; 523 | $fa-var-umbrella: "\f0e9"; 524 | $fa-var-underline: "\f0cd"; 525 | $fa-var-undo: "\f0e2"; 526 | $fa-var-university: "\f19c"; 527 | $fa-var-unlink: "\f127"; 528 | $fa-var-unlock: "\f09c"; 529 | $fa-var-unlock-alt: "\f13e"; 530 | $fa-var-unsorted: "\f0dc"; 531 | $fa-var-upload: "\f093"; 532 | $fa-var-usd: "\f155"; 533 | $fa-var-user: "\f007"; 534 | $fa-var-user-md: "\f0f0"; 535 | $fa-var-users: "\f0c0"; 536 | $fa-var-video-camera: "\f03d"; 537 | $fa-var-vimeo-square: "\f194"; 538 | $fa-var-vine: "\f1ca"; 539 | $fa-var-vk: "\f189"; 540 | $fa-var-volume-down: "\f027"; 541 | $fa-var-volume-off: "\f026"; 542 | $fa-var-volume-up: "\f028"; 543 | $fa-var-warning: "\f071"; 544 | $fa-var-wechat: "\f1d7"; 545 | $fa-var-weibo: "\f18a"; 546 | $fa-var-weixin: "\f1d7"; 547 | $fa-var-wheelchair: "\f193"; 548 | $fa-var-wifi: "\f1eb"; 549 | $fa-var-windows: "\f17a"; 550 | $fa-var-won: "\f159"; 551 | $fa-var-wordpress: "\f19a"; 552 | $fa-var-wrench: "\f0ad"; 553 | $fa-var-xing: "\f168"; 554 | $fa-var-xing-square: "\f169"; 555 | $fa-var-yahoo: "\f19e"; 556 | $fa-var-yelp: "\f1e9"; 557 | $fa-var-yen: "\f157"; 558 | $fa-var-youtube: "\f167"; 559 | $fa-var-youtube-play: "\f16a"; 560 | $fa-var-youtube-square: "\f166"; 561 | 562 | -------------------------------------------------------------------------------- /public/css/font-awesome-4.2.0/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "spinning"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | -------------------------------------------------------------------------------- /public/css/simditor.css: -------------------------------------------------------------------------------- 1 | .simditor { 2 | position: relative; 3 | border: 1px solid #c9d8db; 4 | } 5 | .simditor .simditor-wrapper { 6 | position: relative; 7 | background: #ffffff; 8 | overflow: hidden; 9 | } 10 | .simditor .simditor-wrapper .simditor-placeholder { 11 | display: none; 12 | position: absolute; 13 | left: 0; 14 | z-index: 0; 15 | padding: 22px 15px; 16 | font-size: 16px; 17 | font-family: arial, sans-serif; 18 | line-height: 1.5; 19 | color: #999999; 20 | background: transparent; 21 | } 22 | .simditor .simditor-wrapper.toolbar-floating .simditor-toolbar { 23 | position: fixed; 24 | top: 0; 25 | z-index: 10; 26 | box-shadow: 0 0 6px rgba(0, 0, 0, 0.1); 27 | } 28 | .simditor .simditor-wrapper .simditor-image-loading { 29 | width: 100%; 30 | height: 100%; 31 | background: rgba(0, 0, 0, 0.4); 32 | position: absolute; 33 | top: 0; 34 | left: 0; 35 | z-index: 2; 36 | } 37 | .simditor .simditor-wrapper .simditor-image-loading span { 38 | width: 30px; 39 | height: 30px; 40 | background: #ffffff url(../images/loading-upload.gif) no-repeat center center; 41 | border-radius: 30px; 42 | position: absolute; 43 | top: 50%; 44 | left: 50%; 45 | margin: -15px 0 0 -15px; 46 | box-shadow: 0 0 8px rgba(0, 0, 0, 0.4); 47 | } 48 | .simditor .simditor-wrapper .simditor-image-loading.uploading span { 49 | background: #ffffff; 50 | color: #333333; 51 | font-size: 14px; 52 | line-height: 30px; 53 | text-align: center; 54 | } 55 | .simditor .simditor-body { 56 | padding: 22px 15px 40px; 57 | min-height: 300px; 58 | outline: none; 59 | cursor: text; 60 | position: relative; 61 | z-index: 1; 62 | background: transparent; 63 | } 64 | .simditor .simditor-body a.selected { 65 | background: #b3d4fd; 66 | } 67 | .simditor .simditor-body a.simditor-mention { 68 | cursor: pointer; 69 | } 70 | .simditor .simditor-body .simditor-table { 71 | position: relative; 72 | } 73 | .simditor .simditor-body .simditor-table.resizing { 74 | cursor: col-resize; 75 | } 76 | .simditor .simditor-body .simditor-table .simditor-resize-handle { 77 | position: absolute; 78 | left: 0; 79 | top: 0; 80 | width: 10px; 81 | height: 100%; 82 | cursor: col-resize; 83 | } 84 | .simditor .simditor-body pre { 85 | /*min-height: 28px;*/ 86 | box-sizing: border-box; 87 | -moz-box-sizing: border-box; 88 | word-wrap: break-word !important; 89 | white-space: pre-wrap !important; 90 | } 91 | .simditor .simditor-body img { 92 | cursor: pointer; 93 | } 94 | .simditor .simditor-body img.selected { 95 | box-shadow: 0 0 0 4px #cccccc; 96 | } 97 | .simditor .simditor-paste-area, 98 | .simditor .simditor-clean-paste-area { 99 | background: transparent; 100 | border: none; 101 | outline: none; 102 | resize: none; 103 | padding: 0; 104 | margin: 0; 105 | } 106 | .simditor .simditor-toolbar { 107 | border-bottom: 1px solid #eeeeee; 108 | background: #ffffff; 109 | width: 100%; 110 | } 111 | .simditor .simditor-toolbar > ul { 112 | margin: 0; 113 | padding: 0 0 0 6px; 114 | list-style: none; 115 | } 116 | .simditor .simditor-toolbar > ul:after { 117 | content: ""; 118 | display: table; 119 | clear: both; 120 | } 121 | .simditor .simditor-toolbar > ul > li { 122 | position: relative; 123 | float: left; 124 | } 125 | .simditor .simditor-toolbar > ul > li > span.separator { 126 | display: block; 127 | float: left; 128 | background: #cfcfcf; 129 | width: 1px; 130 | height: 18px; 131 | margin: 11px 15px; 132 | } 133 | .simditor .simditor-toolbar > ul > li > .toolbar-item { 134 | display: block; 135 | float: left; 136 | width: 50px; 137 | height: 40px; 138 | outline: none; 139 | color: #333333; 140 | font-size: 15px; 141 | line-height: 40px; 142 | text-align: center; 143 | text-decoration: none; 144 | } 145 | .simditor .simditor-toolbar > ul > li > .toolbar-item span { 146 | opacity: 0.6; 147 | } 148 | .simditor .simditor-toolbar > ul > li > .toolbar-item span.fa { 149 | display: inline; 150 | line-height: normal; 151 | } 152 | .simditor .simditor-toolbar > ul > li > .toolbar-item:hover span { 153 | opacity: 1; 154 | } 155 | .simditor .simditor-toolbar > ul > li > .toolbar-item.active { 156 | background: #eeeeee; 157 | } 158 | .simditor .simditor-toolbar > ul > li > .toolbar-item.active span { 159 | opacity: 1; 160 | } 161 | .simditor .simditor-toolbar > ul > li > .toolbar-item.disabled { 162 | cursor: default; 163 | } 164 | .simditor .simditor-toolbar > ul > li > .toolbar-item.disabled span { 165 | opacity: 0.3; 166 | } 167 | .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title span:before { 168 | content: "T"; 169 | font-size: 19px; 170 | font-weight: bold; 171 | font-family: 'Times New Roman'; 172 | } 173 | .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h1 span:before { 174 | content: 'H1'; 175 | font-size: 18px; 176 | } 177 | .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h2 span:before { 178 | content: 'H2'; 179 | font-size: 18px; 180 | } 181 | .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h3 span:before { 182 | content: 'H3'; 183 | font-size: 18px; 184 | } 185 | .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color { 186 | font-size: 14px; 187 | position: relative; 188 | } 189 | .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color span:before { 190 | position: relative; 191 | top: -2px; 192 | } 193 | .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color:after { 194 | content: ''; 195 | display: block; 196 | width: 14px; 197 | height: 4px; 198 | background: #cccccc; 199 | position: absolute; 200 | top: 26px; 201 | left: 50%; 202 | margin: 0 0 0 -7px; 203 | } 204 | .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color:hover:after { 205 | background: #999999; 206 | } 207 | .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color.disabled:after { 208 | background: #dfdfdf; 209 | } 210 | .simditor .simditor-toolbar > ul > li.menu-on .toolbar-item { 211 | position: relative; 212 | z-index: 21; 213 | background: #ffffff; 214 | box-shadow: 0 -3px 3px rgba(0, 0, 0, 0.2); 215 | } 216 | .simditor .simditor-toolbar > ul > li.menu-on .toolbar-item span { 217 | opacity: 1; 218 | } 219 | .simditor .simditor-toolbar > ul > li.menu-on .toolbar-item.toolbar-item-color:after { 220 | background: #999999; 221 | } 222 | .simditor .simditor-toolbar > ul > li.menu-on .toolbar-menu { 223 | display: block; 224 | } 225 | .simditor .simditor-toolbar .toolbar-menu { 226 | display: none; 227 | position: absolute; 228 | top: 40px; 229 | left: 0; 230 | z-index: 20; 231 | background: #ffffff; 232 | text-align: left; 233 | box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); 234 | } 235 | .simditor .simditor-toolbar .toolbar-menu ul { 236 | min-width: 160px; 237 | list-style: none; 238 | margin: 0; 239 | padding: 10px 1px; 240 | } 241 | .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item { 242 | display: block; 243 | font-size: 16px; 244 | line-height: 2em; 245 | padding: 0 10px; 246 | text-decoration: none; 247 | color: #666666; 248 | } 249 | .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item:hover { 250 | background: #f6f6f6; 251 | } 252 | .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h1 { 253 | font-size: 24px; 254 | color: #333333; 255 | } 256 | .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h2 { 257 | font-size: 22px; 258 | color: #333333; 259 | } 260 | .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h3 { 261 | font-size: 20px; 262 | color: #333333; 263 | } 264 | .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h4 { 265 | font-size: 18px; 266 | color: #333333; 267 | } 268 | .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h5 { 269 | font-size: 16px; 270 | color: #333333; 271 | } 272 | .simditor .simditor-toolbar .toolbar-menu ul > li .separator { 273 | display: block; 274 | border-top: 1px solid #cccccc; 275 | height: 0; 276 | line-height: 0; 277 | font-size: 0; 278 | margin: 6px 0; 279 | } 280 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color { 281 | width: 96px; 282 | } 283 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list { 284 | height: 40px; 285 | margin: 10px 6px 6px 10px; 286 | padding: 0; 287 | min-width: 0; 288 | } 289 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li { 290 | float: left; 291 | margin: 0 4px 4px 0; 292 | } 293 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color { 294 | display: block; 295 | width: 16px; 296 | height: 16px; 297 | background: #dfdfdf; 298 | border-radius: 2px; 299 | } 300 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color:hover { 301 | opacity: 0.8; 302 | } 303 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color.font-color-default { 304 | background: #333333; 305 | } 306 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-1 { 307 | background: #E33737; 308 | } 309 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-2 { 310 | background: #e28b41; 311 | } 312 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-3 { 313 | background: #c8a732; 314 | } 315 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-4 { 316 | background: #209361; 317 | } 318 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-5 { 319 | background: #418caf; 320 | } 321 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-6 { 322 | background: #aa8773; 323 | } 324 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-7 { 325 | background: #999999; 326 | } 327 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table { 328 | background: #ffffff; 329 | } 330 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table { 331 | border: none; 332 | border-collapse: collapse; 333 | border-spacing: 0; 334 | table-layout: fixed; 335 | } 336 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td { 337 | height: 16px; 338 | padding: 0; 339 | border: 2px solid #ffffff; 340 | background: #f3f3f3; 341 | cursor: pointer; 342 | } 343 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td:before { 344 | width: 16px; 345 | display: block; 346 | content: ""; 347 | } 348 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td.selected { 349 | background: #cfcfcf; 350 | } 351 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table { 352 | display: none; 353 | } 354 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table ul { 355 | min-width: 240px; 356 | } 357 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image { 358 | position: relative; 359 | overflow: hidden; 360 | } 361 | .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image input[type=file] { 362 | position: absolute; 363 | right: 0px; 364 | top: 0px; 365 | opacity: 0; 366 | font-size: 100px; 367 | cursor: pointer; 368 | } 369 | .simditor .simditor-popover { 370 | display: none; 371 | padding: 5px 8px 0; 372 | background: #ffffff; 373 | box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4); 374 | border-radius: 2px; 375 | position: absolute; 376 | z-index: 2; 377 | } 378 | .simditor .simditor-popover .settings-field { 379 | margin: 0 0 5px 0; 380 | font-size: 12px; 381 | height: 25px; 382 | line-height: 25px; 383 | } 384 | .simditor .simditor-popover .settings-field label { 385 | margin: 0 8px 0 0; 386 | float: left; 387 | } 388 | .simditor .simditor-popover .settings-field input[type=text] { 389 | float: left; 390 | width: 200px; 391 | box-sizing: border-box; 392 | font-size: 12px; 393 | } 394 | .simditor .simditor-popover .settings-field input[type=text].image-size { 395 | width: 87px; 396 | } 397 | .simditor .simditor-popover .settings-field .times { 398 | float: left; 399 | width: 26px; 400 | font-size: 12px; 401 | text-align: center; 402 | } 403 | .simditor .simditor-popover.link-popover .btn-unlink, .simditor .simditor-popover.image-popover .btn-upload, .simditor .simditor-popover.image-popover .btn-restore { 404 | float: left; 405 | margin: 0 0 0 8px; 406 | color: #333333; 407 | font-size: 14px; 408 | outline: 0; 409 | } 410 | .simditor .simditor-popover.link-popover .btn-unlink span, .simditor .simditor-popover.image-popover .btn-upload span, .simditor .simditor-popover.image-popover .btn-restore span { 411 | opacity: 0.6; 412 | } 413 | .simditor .simditor-popover.link-popover .btn-unlink:hover span, .simditor .simditor-popover.image-popover .btn-upload:hover span, .simditor .simditor-popover.image-popover .btn-restore:hover span { 414 | opacity: 1; 415 | } 416 | .simditor .simditor-popover.image-popover .btn-upload { 417 | position: relative; 418 | display: inline-block; 419 | overflow: hidden; 420 | } 421 | .simditor .simditor-popover.image-popover .btn-upload input[type=file] { 422 | position: absolute; 423 | right: 0px; 424 | top: 0px; 425 | opacity: 0; 426 | height: 100%; 427 | width: 28px; 428 | } 429 | .simditor.simditor-mobile .simditor-toolbar > ul > li > .toolbar-item { 430 | width: 46px; 431 | } 432 | .simditor.simditor-mobile .simditor-wrapper.toolbar-floating .simditor-toolbar { 433 | position: absolute; 434 | top: 0; 435 | z-index: 10; 436 | box-shadow: 0 0 6px rgba(0, 0, 0, 0.1); 437 | } 438 | 439 | .simditor .simditor-body, .editor-style { 440 | font-size: 16px; 441 | font-family: arial, sans-serif; 442 | line-height: 1.6; 443 | color: #333; 444 | outline: none; 445 | word-wrap: break-word; 446 | } 447 | .simditor .simditor-body > :first-child, .editor-style > :first-child { 448 | margin-top: 0 !important; 449 | } 450 | .simditor .simditor-body a, .editor-style a { 451 | color: #4298BA; 452 | text-decoration: none; 453 | word-break: break-all; 454 | } 455 | .simditor .simditor-body a:visited, .editor-style a:visited { 456 | color: #4298BA; 457 | } 458 | .simditor .simditor-body a:hover, .editor-style a:hover { 459 | color: #0F769F; 460 | } 461 | .simditor .simditor-body a:active, .editor-style a:active { 462 | color: #9E792E; 463 | } 464 | .simditor .simditor-body a:hover, .simditor .simditor-body a:active, .editor-style a:hover, .editor-style a:active { 465 | outline: 0; 466 | } 467 | .simditor .simditor-body h1, .simditor .simditor-body h2, .simditor .simditor-body h3, .simditor .simditor-body h4, .simditor .simditor-body h5, .simditor .simditor-body h6, .editor-style h1, .editor-style h2, .editor-style h3, .editor-style h4, .editor-style h5, .editor-style h6 { 468 | font-weight: normal; 469 | margin: 40px 0 20px; 470 | color: #000000; 471 | } 472 | .simditor .simditor-body h1, .editor-style h1 { 473 | font-size: 24px; 474 | } 475 | .simditor .simditor-body h2, .editor-style h2 { 476 | font-size: 22px; 477 | } 478 | .simditor .simditor-body h3, .editor-style h3 { 479 | font-size: 20px; 480 | } 481 | .simditor .simditor-body h4, .editor-style h4 { 482 | font-size: 18px; 483 | } 484 | .simditor .simditor-body h5, .editor-style h5 { 485 | font-size: 16px; 486 | } 487 | .simditor .simditor-body h6, .editor-style h6 { 488 | font-size: 16px; 489 | } 490 | .simditor .simditor-body p, .simditor .simditor-body div, .editor-style p, .editor-style div { 491 | word-wrap: break-word; 492 | margin: 0 0 15px 0; 493 | color: #333; 494 | word-wrap: break-word; 495 | } 496 | .simditor .simditor-body b, .simditor .simditor-body strong, .editor-style b, .editor-style strong { 497 | font-weight: bold; 498 | } 499 | .simditor .simditor-body i, .simditor .simditor-body em, .editor-style i, .editor-style em { 500 | font-style: italic; 501 | } 502 | .simditor .simditor-body u, .editor-style u { 503 | text-decoration: underline; 504 | } 505 | .simditor .simditor-body strike, .simditor .simditor-body del, .editor-style strike, .editor-style del { 506 | text-decoration: line-through; 507 | } 508 | .simditor .simditor-body ul, .simditor .simditor-body ol, .editor-style ul, .editor-style ol { 509 | list-style: disc outside none; 510 | margin: 15px 0; 511 | padding: 0 0 0 40px; 512 | line-height: 1.6; 513 | } 514 | .simditor .simditor-body ul ul, .simditor .simditor-body ul ol, .simditor .simditor-body ol ul, .simditor .simditor-body ol ol, .editor-style ul ul, .editor-style ul ol, .editor-style ol ul, .editor-style ol ol { 515 | padding-left: 30px; 516 | } 517 | .simditor .simditor-body ul ul, .simditor .simditor-body ol ul, .editor-style ul ul, .editor-style ol ul { 518 | list-style: circle outside none; 519 | } 520 | .simditor .simditor-body ul ul ul, .simditor .simditor-body ol ul ul, .editor-style ul ul ul, .editor-style ol ul ul { 521 | list-style: square outside none; 522 | } 523 | .simditor .simditor-body ol, .editor-style ol { 524 | list-style: decimal; 525 | } 526 | .simditor .simditor-body blockquote, .editor-style blockquote { 527 | border-left: 6px solid #ddd; 528 | padding: 5px 0 5px 10px; 529 | margin: 15px 0 15px 15px; 530 | } 531 | .simditor .simditor-body blockquote > :first-child, .editor-style blockquote > :first-child { 532 | margin-top: 0; 533 | } 534 | .simditor .simditor-body pre, .editor-style pre { 535 | padding: 10px 5px 10px 10px; 536 | margin: 15px 0; 537 | display: block; 538 | line-height: 18px; 539 | background: #F0F0F0; 540 | border-radius: 3px; 541 | font-size: 13px; 542 | font-family: 'monaco', 'Consolas', "Liberation Mono", Courier, monospace; 543 | overflow-x: auto; 544 | white-space: nowrap; 545 | } 546 | .simditor .simditor-body code, .editor-style code { 547 | display: inline-block; 548 | padding: 0 4px; 549 | margin: 0 5px; 550 | background: #eeeeee; 551 | border-radius: 3px; 552 | font-size: 13px; 553 | font-family: 'monaco', 'Consolas', "Liberation Mono", Courier, monospace; 554 | } 555 | .simditor .simditor-body hr, .editor-style hr { 556 | display: block; 557 | height: 0px; 558 | border: 0; 559 | border-top: 1px solid #ccc; 560 | margin: 15px 0; 561 | padding: 0; 562 | } 563 | .simditor .simditor-body table, .editor-style table { 564 | width: 100%; 565 | table-layout: fixed; 566 | border-collapse: collapse; 567 | border-spacing: 0; 568 | margin: 15px 0; 569 | } 570 | .simditor .simditor-body table thead, .editor-style table thead { 571 | background-color: #f9f9f9; 572 | } 573 | .simditor .simditor-body table td, .editor-style table td { 574 | min-width: 40px; 575 | height: 30px; 576 | border: 1px solid #ccc; 577 | vertical-align: top; 578 | padding: 2px 4px; 579 | box-sizing: border-box; 580 | } 581 | .simditor .simditor-body table td.active, .editor-style table td.active { 582 | background-color: #ffffee; 583 | } 584 | .simditor .simditor-body img, .editor-style img { 585 | margin: 0 5px; 586 | vertical-align: middle; 587 | } 588 | .simditor .simditor-body *[data-indent="0"], .editor-style *[data-indent="0"] { 589 | margin-left: 0px; 590 | } 591 | .simditor .simditor-body *[data-indent="1"], .editor-style *[data-indent="1"] { 592 | margin-left: 40px; 593 | } 594 | .simditor .simditor-body *[data-indent="2"], .editor-style *[data-indent="2"] { 595 | margin-left: 80px; 596 | } 597 | .simditor .simditor-body *[data-indent="3"], .editor-style *[data-indent="3"] { 598 | margin-left: 120px; 599 | } 600 | .simditor .simditor-body *[data-indent="4"], .editor-style *[data-indent="4"] { 601 | margin-left: 160px; 602 | } 603 | .simditor .simditor-body *[data-indent="5"], .editor-style *[data-indent="5"] { 604 | margin-left: 200px; 605 | } 606 | .simditor .simditor-body *[data-indent="6"], .editor-style *[data-indent="6"] { 607 | margin-left: 240px; 608 | } 609 | .simditor .simditor-body *[data-indent="7"], .editor-style *[data-indent="7"] { 610 | margin-left: 280px; 611 | } 612 | .simditor .simditor-body *[data-indent="8"], .editor-style *[data-indent="8"] { 613 | margin-left: 320px; 614 | } 615 | .simditor .simditor-body *[data-indent="9"], .editor-style *[data-indent="9"] { 616 | margin-left: 360px; 617 | } 618 | .simditor .simditor-body *[data-indent="10"], .editor-style *[data-indent="10"] { 619 | margin-left: 400px; 620 | } 621 | -------------------------------------------------------------------------------- /public/css/style.css: -------------------------------------------------------------------------------- 1 | #top_banner { 2 | background-color: #C5E0DC; 3 | /*background-color: #60DFE5;*/ 4 | color: #774F38; 5 | } 6 | 7 | .navbar { 8 | border: 0px solid transparent; 9 | margin-bottom: 0px; 10 | } 11 | 12 | #title { 13 | margin-top: 25px; 14 | } 15 | 16 | #title h1 { 17 | font-family: Lobster; 18 | font-size: 3.3em; 19 | } 20 | 21 | #wrapper { 22 | height: 720px; 23 | } 24 | 25 | #content { 26 | background-color: #ECE5CE; 27 | height: 100%; 28 | } 29 | 30 | #tip-content { 31 | background-color: #FFFFFF; 32 | height: auto; 33 | margin-top: 200px; 34 | } 35 | 36 | #tip-content a { 37 | text-decoration: none; 38 | } 39 | 40 | .round 41 | { 42 | border-bottom-left-radius: 15px; 43 | border-bottom-right-radius: 15px; 44 | border-top-left-radius: 15px; 45 | border-top-right-radius: 15px; 46 | } 47 | 48 | .light-bulb { 49 | bottom:-43px; 50 | left:-30px; 51 | position:absolute; 52 | } 53 | 54 | .tip-text { 55 | font-family: verdana, arial, sans-serif; 56 | margin:50px 75px 75px 150px; 57 | } 58 | 59 | .tip-text .content { 60 | color: red; 61 | font-size: 22px; 62 | } 63 | 64 | 65 | .tip-text .comment { 66 | color: #747D67; 67 | margin-top: 10px; 68 | font-size: 22px; 69 | line-height: 20px; 70 | } 71 | 72 | #tip_id { 73 | display: none; 74 | } 75 | 76 | #tools-container { 77 | margin-top: 110px; 78 | font-family: 'Roboto Condensed', sans-serif; 79 | font-size: 1.8em; 80 | } 81 | 82 | #api-container { 83 | margin-top: 200px; 84 | font-family: 'Roboto Condensed', sans-serif; 85 | font-size: 1.8em; 86 | } 87 | 88 | #api-container .api-icon { 89 | height: 70px; 90 | width: 70px; 91 | border-radius: 70px; 92 | border: 3px solid #FFFFFF; 93 | } 94 | 95 | #api-container .api-counter { 96 | padding-top: 14px; 97 | font-family: "Microsoft YaHei", "微软雅黑", SimSun, "宋体", Heiti, "黑体", sans-serif; 98 | font-size: 0.7em; 99 | } 100 | 101 | #api-container .api-counter span{ 102 | font-family: "Microsoft YaHei", "微软雅黑", SimSun, "宋体", Heiti, "黑体", sans-serif; 103 | font-size: 1.4em; 104 | } 105 | 106 | #api-container .api-url { 107 | margin-left: 30px; 108 | } 109 | 110 | #api-txt{ 111 | margin-top: 40px; 112 | } 113 | 114 | #api-txt a { 115 | margin-top: 10px; 116 | } 117 | 118 | #txt-counter { 119 | color: #774F38; 120 | } 121 | 122 | #json-counter { 123 | color: #774F38; 124 | } 125 | 126 | #cast-container { 127 | margin-top: 80px; 128 | } 129 | 130 | #show-notes { 131 | background-color: #FFFFFF; 132 | padding: 15px; 133 | } 134 | 135 | #comments{ 136 | margin-top: 60px; 137 | margin-bottom: 100px; 138 | } 139 | 140 | #footer { 141 | background-color: #E08E79; 142 | height: 50px; 143 | } 144 | 145 | #about-content { 146 | background-color: #FFFFFF; 147 | height: auto; 148 | margin-top: 200px; 149 | } 150 | 151 | #about{ 152 | color: #747D67; 153 | font-family: "Microsoft YaHei", "微软雅黑", SimSun, "宋体", Heiti, "黑体", sans-serif; 154 | font-size: 1.4em; 155 | } 156 | 157 | #avatar { 158 | margin-top: 20px; 159 | border-radius: 80px; 160 | border: 3px solid #FFFFFF; 161 | width: 80px; 162 | height: 80px; 163 | } 164 | 165 | #sign { 166 | margin-top: 40px; 167 | padding-left: 0px; 168 | font-family: Lobster; 169 | font-size: 2.0em; 170 | color: #774F38; 171 | } 172 | 173 | #sitelog{ 174 | margin-top: 60px; 175 | color: #774F38; 176 | font-family: "Microsoft YaHei", "微软雅黑", SimSun, "宋体", Heiti, "黑体", sans-serif; 177 | font-size: 1.4em; 178 | } 179 | 180 | #timeline { 181 | margin-top: 50px; 182 | margin-bottom: 100px; 183 | } 184 | 185 | #copyright { 186 | margin-top: 15px; 187 | } 188 | 189 | -------------------------------------------------------------------------------- /public/css/tools.css: -------------------------------------------------------------------------------- 1 | /* Hover Card 2 | .......................................................................*/ 3 | div.catCard { 4 | border: solid 5px #e9e9e9; 5 | background: #d8d8d8; 6 | width: 220px; 7 | height: 400px; 8 | display: block; 9 | position: relative; 10 | overflow: hidden; 11 | } 12 | div.lowerCatCard { 13 | position: absolute; 14 | background: #e9e9e9; 15 | padding: 5px 5px; 16 | height: 200px; 17 | -webkit-transition: all 0.6s ease; 18 | -moz-transition: all 0.6s ease; 19 | -o-transition: all 0.6s ease; 20 | transition: all 0.6s ease; 21 | } 22 | div.lowerCatCard p { 23 | font-size: 0.6em; 24 | color: #774F38; 25 | font-family: "Microsoft YaHei", "微软雅黑", SimSun, "宋体", Heiti, "黑体", sans-serif; 26 | } 27 | div.lowerCatCard:hover { 28 | opacity: 0.95; 29 | bottom: 0; 30 | height: 390px; 31 | } 32 | div.catCard div.lowerCatCard { 33 | left: 0; 34 | bottom: -3%; 35 | width: 215px; 36 | } 37 | div.catCard:hover div.lowerCatCard { 38 | bottom: 0; 39 | } 40 | li.catCardList { 41 | width:225px; 42 | display: inline-block; 43 | margin-right: 19px; 44 | margin-left: 19px; 45 | margin-top: 25px; 46 | } 47 | li.catCardList-last { 48 | margin-right: 0; 49 | width:225px; 50 | display: inline-block; 51 | } 52 | ul.catCardList { 53 | margin: 0; 54 | } 55 | #catCardButton { 56 | position: absolute; 57 | width: 200px; 58 | bottom: 5px; 59 | -webkit-transition: all 0.6s ease; 60 | -moz-transition: all 0.6s ease; 61 | -o-transition: all 0.6s ease; 62 | } 63 | div.lowerCatCard:hover #catCardButton { 64 | bottom: 5px; 65 | } 66 | .catCard img { 67 | border: 1px solid #dddddd; 68 | width: 219px; 69 | height: 198px; 70 | } 71 | .catCard img:hover { 72 | border: 1px solid #bababa; 73 | } 74 | 75 | /* Button 76 | .......................................................................*/ 77 | .button { 78 | cursor: pointer; 79 | font-size: 14px !important; 80 | color: #ffffff; 81 | padding: 7px 10px !important; 82 | text-decoration: none !important; 83 | text-transform: uppercase !important; 84 | letter-spacing: 0 !important; 85 | background: #000; 86 | border: none; 87 | border-bottom: solid 1px #c90c12; 88 | text-align: center; 89 | margin-top: 10px; 90 | } 91 | .button:hover { 92 | background-color: #c90c12; 93 | border: none; 94 | border-bottom: solid 1px #000; 95 | box-shadow: 0 2px 3px #a8a8a8; 96 | transform: scale(1.04); 97 | -webkit-transform: scale(1.04); 98 | -moz-transform: scale(1.04); 99 | -o-transform: scale(1.04); 100 | -ms-transform: scale(1.04); 101 | } 102 | .button:active { 103 | background: #000; 104 | } 105 | .button a { 106 | color: #ffffff; 107 | padding: 7px 30px !important; 108 | text-decoration: none; 109 | } 110 | .button a:hover { 111 | color: #ffffff; 112 | } 113 | .button:hover { 114 | color: #fff; 115 | } -------------------------------------------------------------------------------- /public/img/Alfred.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/img/Alfred.jpg -------------------------------------------------------------------------------- /public/img/Swift.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/img/Swift.jpg -------------------------------------------------------------------------------- /public/img/Vim.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/img/Vim.jpg -------------------------------------------------------------------------------- /public/img/api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/img/api.png -------------------------------------------------------------------------------- /public/img/iTimothy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/img/iTimothy.jpg -------------------------------------------------------------------------------- /public/img/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/img/image.png -------------------------------------------------------------------------------- /public/img/lightbulb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/img/lightbulb.png -------------------------------------------------------------------------------- /public/img/loading-upload.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/img/loading-upload.gif -------------------------------------------------------------------------------- /public/img/robot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/img/robot.png -------------------------------------------------------------------------------- /public/img/rocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/img/rocket.png -------------------------------------------------------------------------------- /public/img/vim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/public/img/vim.png -------------------------------------------------------------------------------- /public/js/hotkeys.js: -------------------------------------------------------------------------------- 1 | (function (root, factory) { 2 | if (typeof define === 'function' && define.amd) { 3 | // AMD. Register as an anonymous module. 4 | define('simple-hotkeys', ["jquery", 5 | "simple-module"], function ($, SimpleModule) { 6 | return (root.returnExportsGlobal = factory($, SimpleModule)); 7 | }); 8 | } else if (typeof exports === 'object') { 9 | // Node. Does not work with strict CommonJS, but 10 | // only CommonJS-like enviroments that support module.exports, 11 | // like Node. 12 | module.exports = factory(require("jquery"), 13 | require("simple-module")); 14 | } else { 15 | root.simple = root.simple || {}; 16 | root.simple['hotkeys'] = factory(jQuery, 17 | SimpleModule); 18 | } 19 | }(this, function ($, SimpleModule) { 20 | 21 | var Hotkeys, hotkeys, 22 | __hasProp = {}.hasOwnProperty, 23 | __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; 24 | 25 | Hotkeys = (function(_super) { 26 | __extends(Hotkeys, _super); 27 | 28 | function Hotkeys() { 29 | return Hotkeys.__super__.constructor.apply(this, arguments); 30 | } 31 | 32 | Hotkeys.count = 0; 33 | 34 | Hotkeys.keyNameMap = { 35 | 8: "Backspace", 36 | 9: "Tab", 37 | 13: "Enter", 38 | 16: "Shift", 39 | 17: "Control", 40 | 18: "Alt", 41 | 19: "Pause", 42 | 20: "CapsLock", 43 | 27: "Esc", 44 | 32: "Spacebar", 45 | 33: "PageUp", 46 | 34: "PageDown", 47 | 35: "End", 48 | 36: "Home", 49 | 37: "Left", 50 | 38: "Up", 51 | 39: "Right", 52 | 40: "Down", 53 | 45: "Insert", 54 | 46: "Del", 55 | 91: "Meta", 56 | 93: "Meta", 57 | 48: "0", 58 | 49: "1", 59 | 50: "2", 60 | 51: "3", 61 | 52: "4", 62 | 53: "5", 63 | 54: "6", 64 | 55: "7", 65 | 56: "8", 66 | 57: "9", 67 | 65: "A", 68 | 66: "B", 69 | 67: "C", 70 | 68: "D", 71 | 69: "E", 72 | 70: "F", 73 | 71: "G", 74 | 72: "H", 75 | 73: "I", 76 | 74: "J", 77 | 75: "K", 78 | 76: "L", 79 | 77: "M", 80 | 78: "N", 81 | 79: "O", 82 | 80: "P", 83 | 81: "Q", 84 | 82: "R", 85 | 83: "S", 86 | 84: "T", 87 | 85: "U", 88 | 86: "V", 89 | 87: "W", 90 | 88: "X", 91 | 89: "Y", 92 | 90: "Z", 93 | 96: "0", 94 | 97: "1", 95 | 98: "2", 96 | 99: "3", 97 | 100: "4", 98 | 101: "5", 99 | 102: "6", 100 | 103: "7", 101 | 104: "8", 102 | 105: "9", 103 | 106: "Multiply", 104 | 107: "Add", 105 | 109: "Subtract", 106 | 110: "Decimal", 107 | 111: "Divide", 108 | 112: "F1", 109 | 113: "F2", 110 | 114: "F3", 111 | 115: "F4", 112 | 116: "F5", 113 | 117: "F6", 114 | 118: "F7", 115 | 119: "F8", 116 | 120: "F9", 117 | 121: "F10", 118 | 122: "F11", 119 | 123: "F12", 120 | 124: "F13", 121 | 125: "F14", 122 | 126: "F15", 123 | 127: "F16", 124 | 128: "F17", 125 | 129: "F18", 126 | 130: "F19", 127 | 131: "F20", 128 | 132: "F21", 129 | 133: "F22", 130 | 134: "F23", 131 | 135: "F24", 132 | 59: ";", 133 | 61: "=", 134 | 186: ";", 135 | 187: "=", 136 | 188: ",", 137 | 190: ".", 138 | 191: "/", 139 | 192: "`", 140 | 219: "[", 141 | 220: "\\", 142 | 221: "]", 143 | 222: "'" 144 | }; 145 | 146 | Hotkeys.aliases = { 147 | "escape": "esc", 148 | "delete": "del", 149 | "return": "enter", 150 | "ctrl": "control", 151 | "space": "spacebar", 152 | "ins": "insert", 153 | "cmd": "meta", 154 | "command": "meta", 155 | "wins": "meta", 156 | "windows": "meta" 157 | }; 158 | 159 | Hotkeys.normalize = function(shortcut) { 160 | var i, key, keyname, keys, _i, _len; 161 | keys = shortcut.toLowerCase().replace(/\s+/gi, "").split("+"); 162 | for (i = _i = 0, _len = keys.length; _i < _len; i = ++_i) { 163 | key = keys[i]; 164 | keys[i] = this.aliases[key] || key; 165 | } 166 | keyname = keys.pop(); 167 | keys.sort().push(keyname); 168 | return keys.join("_"); 169 | }; 170 | 171 | Hotkeys.prototype.opts = { 172 | el: document 173 | }; 174 | 175 | Hotkeys.prototype._init = function() { 176 | this.id = ++this.constructor.count; 177 | this._map = {}; 178 | this._delegate = typeof this.opts.el === "string" ? document : this.opts.el; 179 | return $(this._delegate).on("keydown.simple-hotkeys-" + this.id, this.opts.el, (function(_this) { 180 | return function(e) { 181 | var _ref; 182 | return (_ref = _this._getHander(e)) != null ? _ref.call(_this, e) : void 0; 183 | }; 184 | })(this)); 185 | }; 186 | 187 | Hotkeys.prototype._getHander = function(e) { 188 | var keyname, shortcut; 189 | if (!(keyname = this.constructor.keyNameMap[e.which])) { 190 | return; 191 | } 192 | shortcut = ""; 193 | if (e.altKey) { 194 | shortcut += "alt_"; 195 | } 196 | if (e.ctrlKey) { 197 | shortcut += "control_"; 198 | } 199 | if (e.metaKey) { 200 | shortcut += "meta_"; 201 | } 202 | if (e.shiftKey) { 203 | shortcut += "shift_"; 204 | } 205 | shortcut += keyname.toLowerCase(); 206 | return this._map[shortcut]; 207 | }; 208 | 209 | Hotkeys.prototype.respondTo = function(subject) { 210 | if (typeof subject === 'string') { 211 | return this._map[this.constructor.normalize(subject)] != null; 212 | } else { 213 | return this._getHander(subject) != null; 214 | } 215 | }; 216 | 217 | Hotkeys.prototype.add = function(shortcut, handler) { 218 | this._map[this.constructor.normalize(shortcut)] = handler; 219 | return this; 220 | }; 221 | 222 | Hotkeys.prototype.remove = function(shortcut) { 223 | delete this._map[this.constructor.normalize(shortcut)]; 224 | return this; 225 | }; 226 | 227 | Hotkeys.prototype.destroy = function() { 228 | $(this._delegate).off(".simple-hotkeys-" + this.id); 229 | this._map = {}; 230 | return this; 231 | }; 232 | 233 | return Hotkeys; 234 | 235 | })(SimpleModule); 236 | 237 | hotkeys = function(opts) { 238 | return new Hotkeys(opts); 239 | }; 240 | 241 | 242 | return hotkeys; 243 | 244 | 245 | })); 246 | 247 | -------------------------------------------------------------------------------- /public/js/module.js: -------------------------------------------------------------------------------- 1 | (function (root, factory) { 2 | if (typeof define === 'function' && define.amd) { 3 | // AMD. Register as an anonymous module. 4 | define('simple-module', ["jquery"], function ($) { 5 | return (root.returnExportsGlobal = factory($)); 6 | }); 7 | } else if (typeof exports === 'object') { 8 | // Node. Does not work with strict CommonJS, but 9 | // only CommonJS-like enviroments that support module.exports, 10 | // like Node. 11 | module.exports = factory(require("jquery")); 12 | } else { 13 | root['SimpleModule'] = factory(jQuery); 14 | } 15 | }(this, function ($) { 16 | 17 | var Module, 18 | __slice = [].slice; 19 | 20 | Module = (function() { 21 | Module.extend = function(obj) { 22 | var key, val, _ref; 23 | if (!((obj != null) && typeof obj === 'object')) { 24 | return; 25 | } 26 | for (key in obj) { 27 | val = obj[key]; 28 | if (key !== 'included' && key !== 'extended') { 29 | this[key] = val; 30 | } 31 | } 32 | return (_ref = obj.extended) != null ? _ref.call(this) : void 0; 33 | }; 34 | 35 | Module.include = function(obj) { 36 | var key, val, _ref; 37 | if (!((obj != null) && typeof obj === 'object')) { 38 | return; 39 | } 40 | for (key in obj) { 41 | val = obj[key]; 42 | if (key !== 'included' && key !== 'extended') { 43 | this.prototype[key] = val; 44 | } 45 | } 46 | return (_ref = obj.included) != null ? _ref.call(this) : void 0; 47 | }; 48 | 49 | Module.connect = function(cls) { 50 | if (typeof cls !== 'function') { 51 | return; 52 | } 53 | if (!cls.pluginName) { 54 | throw new Error('Module.connect: cannot connect plugin without pluginName'); 55 | return; 56 | } 57 | cls.prototype._connected = true; 58 | if (!this._connectedClasses) { 59 | this._connectedClasses = []; 60 | } 61 | this._connectedClasses.push(cls); 62 | if (cls.pluginName) { 63 | return this[cls.pluginName] = cls; 64 | } 65 | }; 66 | 67 | Module.prototype.opts = {}; 68 | 69 | function Module(opts) { 70 | var cls, instance, instances, name, _base, _i, _len; 71 | this.opts = $.extend({}, this.opts, opts); 72 | (_base = this.constructor)._connectedClasses || (_base._connectedClasses = []); 73 | instances = (function() { 74 | var _i, _len, _ref, _results; 75 | _ref = this.constructor._connectedClasses; 76 | _results = []; 77 | for (_i = 0, _len = _ref.length; _i < _len; _i++) { 78 | cls = _ref[_i]; 79 | name = cls.pluginName.charAt(0).toLowerCase() + cls.pluginName.slice(1); 80 | if (cls.prototype._connected) { 81 | cls.prototype._module = this; 82 | } 83 | _results.push(this[name] = new cls()); 84 | } 85 | return _results; 86 | }).call(this); 87 | if (this._connected) { 88 | this.opts = $.extend({}, this.opts, this._module.opts); 89 | } else { 90 | this._init(); 91 | for (_i = 0, _len = instances.length; _i < _len; _i++) { 92 | instance = instances[_i]; 93 | if (typeof instance._init === "function") { 94 | instance._init(); 95 | } 96 | } 97 | } 98 | this.trigger('initialized'); 99 | } 100 | 101 | Module.prototype._init = function() {}; 102 | 103 | Module.prototype.on = function() { 104 | var args, _ref; 105 | args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; 106 | (_ref = $(this)).on.apply(_ref, args); 107 | return this; 108 | }; 109 | 110 | Module.prototype.one = function() { 111 | var args, _ref; 112 | args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; 113 | (_ref = $(this)).one.apply(_ref, args); 114 | return this; 115 | }; 116 | 117 | Module.prototype.off = function() { 118 | var args, _ref; 119 | args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; 120 | (_ref = $(this)).off.apply(_ref, args); 121 | return this; 122 | }; 123 | 124 | Module.prototype.trigger = function() { 125 | var args, _ref; 126 | args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; 127 | (_ref = $(this)).trigger.apply(_ref, args); 128 | return this; 129 | }; 130 | 131 | Module.prototype.triggerHandler = function() { 132 | var args, _ref; 133 | args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; 134 | return (_ref = $(this)).triggerHandler.apply(_ref, args); 135 | }; 136 | 137 | Module.prototype._t = function() { 138 | var args, _ref; 139 | args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; 140 | return (_ref = this.constructor)._t.apply(_ref, args); 141 | }; 142 | 143 | Module._t = function() { 144 | var args, key, result, _ref; 145 | key = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; 146 | result = ((_ref = this.i18n[this.locale]) != null ? _ref[key] : void 0) || ''; 147 | if (!(args.length > 0)) { 148 | return result; 149 | } 150 | result = result.replace(/([^%]|^)%(?:(\d+)\$)?s/g, function(p0, p, position) { 151 | if (position) { 152 | return p + args[parseInt(position) - 1]; 153 | } else { 154 | return p + args.shift(); 155 | } 156 | }); 157 | return result.replace(/%%s/g, '%s'); 158 | }; 159 | 160 | Module.i18n = { 161 | 'zh-CN': {} 162 | }; 163 | 164 | Module.locale = 'zh-CN'; 165 | 166 | return Module; 167 | 168 | })(); 169 | 170 | 171 | return Module; 172 | 173 | 174 | })); 175 | -------------------------------------------------------------------------------- /public/js/tips.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function(){ 2 | setInterval("refreshTips()", 10000); 3 | }); 4 | 5 | function refreshTips() 6 | { 7 | $("#tip-content").hide(); 8 | 9 | $.get("http://vim-tips.com", function(data){ 10 | var result = $(data); 11 | $(".content").text(result.find('.content').text()); 12 | $(".comment").text(result.find('.comment').text()); 13 | $("#tip_id").text(result.find("#tip_id").text()); 14 | $("#tip-content a").attr("href", "/tips/" + result.find("#tip_id").text()); 15 | }); 16 | 17 | $("#tip-content").delay(1000).fadeIn(2500); 18 | } 19 | -------------------------------------------------------------------------------- /public/js/ws.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function(){ 2 | connectServer(); 3 | }); 4 | 5 | function connectServer() 6 | { 7 | var sock = null; 8 | var wsuri = "ws://vim-tips.com:3000/ws"; 9 | 10 | try 11 | { 12 | sock = new WebSocket(wsuri); 13 | }catch (e) { 14 | } 15 | 16 | sock.onopen = function() { 17 | console.log("connected to " + wsuri); 18 | }; 19 | 20 | sock.onerror = function(e) { 21 | console.log(" error from connect " + e); 22 | }; 23 | 24 | sock.onclose = function(e) { 25 | console.log("connection closed (" + e.code + ")"); 26 | }; 27 | 28 | sock.onmessage = function(e) { 29 | console.log("message received: " + e.data); 30 | 31 | var data = $.parseJSON(e.data); 32 | 33 | if(data.Type == "txt") 34 | { 35 | $("#txt-counter").text(data.Count); 36 | } 37 | else if (data.Type == "json") 38 | { 39 | $("#json-counter").text(data.Count); 40 | } 41 | }; 42 | } -------------------------------------------------------------------------------- /routers/about.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "github.com/codegangsta/martini-contrib/render" 5 | ) 6 | 7 | func HandleAbout(r render.Render) { 8 | r.HTML(200, "about", map[string]interface{}{ 9 | "IsAbout": true}) 10 | } 11 | -------------------------------------------------------------------------------- /routers/admin.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | 7 | "github.com/codegangsta/martini-contrib/render" 8 | "github.com/martini-contrib/sessions" 9 | "github.com/timothyye/vim-tips-web/models" 10 | "golang.org/x/crypto/bcrypt" 11 | "labix.org/v2/mgo" 12 | "labix.org/v2/mgo/bson" 13 | ) 14 | 15 | func validateSession(r render.Render, s sessions.Session) { 16 | isLogin := s.Get("IsLogin") 17 | 18 | if isLogin == nil { 19 | fmt.Println("Not login...") 20 | r.Redirect("/admin/login") 21 | } 22 | } 23 | 24 | func ShowLoginPage(r render.Render, s sessions.Session) { 25 | 26 | isLogin := s.Get("IsLogin") 27 | 28 | if isLogin != nil { 29 | r.Redirect("/admin/index") 30 | return 31 | } 32 | 33 | r.HTML(200, "admin/login", map[string]interface{}{ 34 | "IsAbout": true}, render.HTMLOptions{}) 35 | } 36 | 37 | func HandleLogout(r render.Render, s sessions.Session) { 38 | s.Delete("IsLogin") 39 | r.Redirect("/admin/login") 40 | } 41 | 42 | func HandleLogin(req *http.Request, r render.Render, s sessions.Session, db *mgo.Database) { 43 | username := req.FormValue("username") 44 | pass := req.FormValue("password") 45 | 46 | id := models.Identity{} 47 | 48 | err := db.C("id").Find(bson.M{"email": "admin@vim-tips.com"}).One(&id) 49 | 50 | if err != nil { 51 | fmt.Println(err.Error()) 52 | } 53 | 54 | if username == "admin@vim-tips.com" && bcrypt.CompareHashAndPassword(id.Password, []byte(pass)) == nil { 55 | fmt.Println("Login success!") 56 | s.Set("IsLogin", true) 57 | 58 | r.Redirect("/admin/index") 59 | } else { 60 | r.Redirect("/admin/login") 61 | } 62 | } 63 | 64 | func HandleAdminIndex(r render.Render, db *mgo.Database) { 65 | tips_count, err := db.C("tips").Count() 66 | 67 | if err != nil { 68 | tips_count = 0 69 | } 70 | 71 | casts_count, err := db.C("casts").Count() 72 | 73 | if err != nil { 74 | casts_count = 0 75 | } 76 | 77 | r.HTML(200, "admin/index", map[string]interface{}{ 78 | "IsIndex": true, 79 | "TipsCount": tips_count, 80 | "CastsCount": casts_count}, render.HTMLOptions{Layout: "admin/layout"}) 81 | } 82 | -------------------------------------------------------------------------------- /routers/admin_casts.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "github.com/codegangsta/martini-contrib/render" 5 | "github.com/go-martini/martini" 6 | "github.com/timothyye/martini-paginate" 7 | "github.com/timothyye/vim-tips-web/models" 8 | "html/template" 9 | "labix.org/v2/mgo" 10 | "labix.org/v2/mgo/bson" 11 | "net/http" 12 | ) 13 | 14 | func AdminShowCasts(r render.Render, db *mgo.Database, pager *paginate.Paginator) { 15 | num, _ := db.C("casts").Count() 16 | 17 | pers := 12 18 | pager.Init(pers, num) 19 | 20 | casts := []models.Casts{} 21 | viewCasts := []models.CastsView{} 22 | 23 | db.C("casts").Find(nil).Limit(pers).Skip(pager.Offset()).All(&casts) 24 | 25 | for _, t := range casts { 26 | viewCasts = append(viewCasts, 27 | models.CastsView{Id: t.Id.Hex(), Author: t.Author, AuthorUrl: t.AuthorUrl, 28 | VisitCount: t.VisitCount, Title: t.Title, Intro: template.HTML(t.Intro), ShowNotes: template.HTML(t.ShowNotes), Url: t.Url, LogoUrl: t.LogoUrl}) 29 | } 30 | 31 | r.HTML(200, "admin/casts_index", map[string]interface{}{ 32 | "IsCasts": true, 33 | "Casts": viewCasts, 34 | "Paginator": pager, 35 | "Num": num}, render.HTMLOptions{Layout: "admin/layout"}) 36 | } 37 | 38 | func AdminAddCastsPage(r render.Render, db *mgo.Database) { 39 | r.HTML(200, "admin/casts_add", map[string]interface{}{ 40 | "IsCasts": true}, render.HTMLOptions{Layout: "admin/layout"}) 41 | } 42 | 43 | func AdminAddCasts(req *http.Request, r render.Render, db *mgo.Database) { 44 | author := req.FormValue("author") 45 | aurhor_url := req.FormValue("authorurl") 46 | title := req.FormValue("title") 47 | intro := req.FormValue("intro") 48 | show_notes := req.FormValue("shownotes") 49 | url := req.FormValue("url") 50 | logo_url := req.FormValue("logourl") 51 | 52 | cast := models.Casts{Id: bson.NewObjectId(), Author: author, AuthorUrl: aurhor_url, 53 | VisitCount: 0, Title: title, Intro: intro, ShowNotes: show_notes, Url: url, LogoUrl: logo_url} 54 | db.C("casts").Insert(cast) 55 | 56 | r.Redirect("/admin/casts") 57 | } 58 | 59 | func AdminDelCasts(req *http.Request, r render.Render, db *mgo.Database) { 60 | id := req.FormValue("Id") 61 | db.C("casts").RemoveId(bson.ObjectIdHex(id)) 62 | 63 | r.Redirect("/admin/casts") 64 | } 65 | 66 | func AdminModifyCasts(r render.Render, db *mgo.Database, params martini.Params) { 67 | 68 | cast := models.Casts{} 69 | 70 | db.C("casts").FindId(bson.ObjectIdHex(params["Id"])).One(&cast) 71 | 72 | r.HTML(200, "admin/casts_modify", map[string]interface{}{ 73 | "IsCasts": true, 74 | "Id": params["Id"], 75 | "Cast": cast}, render.HTMLOptions{Layout: "admin/layout"}) 76 | } 77 | 78 | func AdminUpdateCasts(r render.Render, db *mgo.Database, req *http.Request) { 79 | author := req.FormValue("author") 80 | author_url := req.FormValue("authorurl") 81 | title := req.FormValue("title") 82 | intro := req.FormValue("intro") 83 | show_notes := req.FormValue("shownotes") 84 | url := req.FormValue("url") 85 | logo_url := req.FormValue("logourl") 86 | 87 | db.C("casts").UpdateId(bson.ObjectIdHex(req.FormValue("id")), 88 | bson.M{"$set": bson.M{"author": author, 89 | "authorurl": author_url, 90 | "title": title, 91 | "intro": intro, 92 | "shownotes": show_notes, 93 | "url": url, 94 | "logourl": logo_url}}) 95 | 96 | r.Redirect("/admin/casts") 97 | } 98 | -------------------------------------------------------------------------------- /routers/admin_pass.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "code.google.com/p/go.crypto/bcrypt" 5 | "github.com/codegangsta/martini-contrib/render" 6 | "github.com/martini-contrib/sessions" 7 | "labix.org/v2/mgo" 8 | "labix.org/v2/mgo/bson" 9 | "net/http" 10 | ) 11 | 12 | func AdminPassword(r render.Render, s sessions.Session) { 13 | r.HTML(200, "admin/password", map[string]interface{}{ 14 | "IsPassword": true}, render.HTMLOptions{Layout: "admin/layout"}) 15 | } 16 | 17 | func AdminUpdatePassword(req *http.Request, r render.Render, db *mgo.Database) { 18 | pass := req.FormValue("password") 19 | verify := req.FormValue("verify") 20 | 21 | if pass == verify { 22 | 23 | hashedPass, _ := bcrypt.GenerateFromPassword([]byte(pass), bcrypt.DefaultCost) 24 | info, err := db.C("id").Upsert(bson.M{"email": "admin@vim-tips.com"}, bson.M{"$set": bson.M{"password": hashedPass, "email": "admin@vim-tips.com"}}) 25 | 26 | if err == nil { 27 | if info.Updated >= 0 { 28 | r.HTML(200, "admin/password", map[string]interface{}{ 29 | "IsPost": true, 30 | "IsPassword": true, 31 | "IsSuccess": true}, render.HTMLOptions{Layout: "admin/layout"}) 32 | } 33 | } 34 | } else { 35 | r.HTML(200, "admin/password", map[string]interface{}{ 36 | "IsPost": true, 37 | "IsPassword": true, 38 | "IsSuccess": false}, render.HTMLOptions{Layout: "admin/layout"}) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /routers/admin_tips.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "github.com/codegangsta/martini-contrib/render" 5 | "github.com/timothyye/martini-paginate" 6 | "github.com/timothyye/vim-tips-web/models" 7 | "labix.org/v2/mgo" 8 | "labix.org/v2/mgo/bson" 9 | "net/http" 10 | ) 11 | 12 | func AdminShowTips(req *http.Request, r render.Render, db *mgo.Database, pager *paginate.Paginator) { 13 | num, _ := db.C("tips").Count() 14 | 15 | pers := 12 16 | pager.Init(pers, num) 17 | 18 | tips := []models.Tips{} 19 | viewTips := []models.TipsView{} 20 | 21 | db.C("tips").Find(nil).Limit(pers).Skip(pager.Offset()).All(&tips) 22 | 23 | for _, t := range tips { 24 | viewTips = append(viewTips, models.TipsView{Id: t.Id.Hex(), Content: t.Content, Comment: t.Comment}) 25 | } 26 | 27 | r.HTML(200, "admin/tips_index", map[string]interface{}{ 28 | "IsTips": true, 29 | "Tips": viewTips, 30 | "Paginator": pager, 31 | "Num": num}, render.HTMLOptions{Layout: "admin/layout"}) 32 | } 33 | 34 | func AdminAddTips(req *http.Request, r render.Render, db *mgo.Database) { 35 | content := req.FormValue("tip") 36 | comment := req.FormValue("comment") 37 | 38 | tip := models.Tips{Id: bson.NewObjectId(), Content: content, Comment: comment} 39 | db.C("tips").Insert(tip) 40 | 41 | r.Redirect("/admin/tips") 42 | } 43 | 44 | func AdminDelTips(req *http.Request, r render.Render, db *mgo.Database) { 45 | id := req.FormValue("Id") 46 | db.C("tips").RemoveId(bson.ObjectIdHex(id)) 47 | 48 | r.Redirect("/admin/tips") 49 | } 50 | 51 | func AdminModifyTips(req *http.Request, r render.Render, db *mgo.Database) { 52 | r.HTML(200, "admin/index", map[string]interface{}{ 53 | "IsTips": true}, render.HTMLOptions{Layout: "admin/layout"}) 54 | } 55 | -------------------------------------------------------------------------------- /routers/api.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "encoding/json" 5 | 6 | "github.com/codegangsta/martini-contrib/render" 7 | "github.com/timothyye/vim-tips-web/models" 8 | "labix.org/v2/mgo/bson" 9 | ) 10 | 11 | func HandleAPI(r render.Render) { 12 | db := GetDBInstance() 13 | txt_api := models.API{} 14 | json_api := models.API{} 15 | 16 | err := db.C("apis").Find(bson.M{"type": "txt"}).One(&txt_api) 17 | 18 | if err != nil { 19 | r.HTML(200, "500", nil) 20 | return 21 | } 22 | 23 | err = db.C("apis").Find(bson.M{"type": "json"}).One(&json_api) 24 | 25 | if err != nil { 26 | r.HTML(200, "500", nil) 27 | return 28 | } 29 | 30 | r.HTML(200, "api", map[string]interface{}{ 31 | "IsAPI": true, 32 | "TxtCounter": txt_api.Count, 33 | "JsonCounter": json_api.Count}) 34 | 35 | if db.Session != nil { 36 | defer db.Session.Close() 37 | } 38 | } 39 | 40 | func HandleRandomTxtTip() string { 41 | db := GetDBInstance() 42 | tip := models.Tips{} 43 | api := models.API{} 44 | total, _ := db.C("tips").Count() 45 | index := getRandomIndex(total) 46 | db.C("tips").Find(nil).Skip(index).One(&tip) 47 | err := db.C("apis").Find(bson.M{"type": "txt"}).One(&api) 48 | 49 | api.Count++ 50 | 51 | if err != nil { 52 | db.C("apis").Insert(&models.API{Id: bson.NewObjectId(), Type: "txt", Count: 0}) 53 | } else { 54 | db.C("apis").Update(bson.M{"type": "txt"}, bson.M{"type": "txt", "count": api.Count}) 55 | } 56 | 57 | data, err := json.Marshal(api) 58 | 59 | if err == nil { 60 | sendAll(data) 61 | } 62 | 63 | if db.Session != nil { 64 | defer db.Session.Close() 65 | } 66 | 67 | return tip.Content + " " + tip.Comment 68 | } 69 | 70 | func HandleRandomJsonTip(r render.Render) { 71 | 72 | db := GetDBInstance() 73 | tip := models.Tips{} 74 | api := models.API{} 75 | total, _ := db.C("tips").Count() 76 | index := getRandomIndex(total) 77 | db.C("tips").Find(nil).Skip(index).One(&tip) 78 | err := db.C("apis").Find(bson.M{"type": "json"}).One(&api) 79 | 80 | api.Count++ 81 | 82 | if err != nil { 83 | db.C("apis").Insert(&models.API{Id: bson.NewObjectId(), Type: "json", Count: 0}) 84 | } else { 85 | db.C("apis").Update(bson.M{"type": "json"}, bson.M{"type": "json", "count": api.Count}) 86 | } 87 | 88 | data, err := json.Marshal(api) 89 | 90 | if err == nil { 91 | sendAll(data) 92 | } 93 | 94 | if db.Session != nil { 95 | defer db.Session.Close() 96 | } 97 | 98 | r.JSON(200, tip) 99 | } 100 | -------------------------------------------------------------------------------- /routers/api_test.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "fmt" 5 | "labix.org/v2/mgo" 6 | "testing" 7 | ) 8 | 9 | func InitDBConn(t *testing.T) (*mgo.Database, error) { 10 | session, err := mgo.Dial("mongodb://test:test123@ds035240.mongolab.com:35240/vim_tips") 11 | if err != nil { 12 | fmt.Println(err.Error()) 13 | t.Error("Failed to connect to mongo DB...") 14 | } else { 15 | t.Log("Connected to mongo DB...") 16 | } 17 | 18 | return session.DB("vim_tips"), err 19 | } 20 | 21 | func TestHandleRandomTxtTip(t *testing.T) { 22 | db, err := InitDBConn(t) 23 | 24 | if db != nil && err == nil { 25 | 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /routers/casts.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "html/template" 5 | 6 | "github.com/codegangsta/martini-contrib/render" 7 | "github.com/go-martini/martini" 8 | "github.com/timothyye/martini-paginate" 9 | "github.com/timothyye/vim-tips-web/models" 10 | "labix.org/v2/mgo/bson" 11 | ) 12 | 13 | func HandleCasts(r render.Render, pager *paginate.Paginator) { 14 | 15 | db := GetDBInstance() 16 | 17 | num, _ := db.C("casts").Count() 18 | 19 | pers := 6 20 | pager.Init(pers, num) 21 | 22 | casts := []models.Casts{} 23 | viewCasts := []models.CastsView{} 24 | 25 | db.C("casts").Find(nil).Limit(pers).Skip(pager.Offset()).All(&casts) 26 | 27 | for _, t := range casts { 28 | viewCasts = append(viewCasts, 29 | models.CastsView{Id: t.Id.Hex(), 30 | Author: t.Author, 31 | AuthorUrl: t.AuthorUrl, 32 | VisitCount: t.VisitCount, 33 | Title: t.Title, 34 | LogoUrl: t.LogoUrl, 35 | Intro: template.HTML(t.Intro), 36 | ShowNotes: template.HTML(t.ShowNotes), 37 | Url: t.Url}) 38 | } 39 | 40 | if db.Session != nil { 41 | defer db.Session.Close() 42 | } 43 | 44 | r.HTML(200, "casts", map[string]interface{}{ 45 | "IsCasts": true, 46 | "Casts": viewCasts, 47 | "Paginator": pager, 48 | "Num": num}) 49 | } 50 | 51 | func ShowCast(r render.Render, params martini.Params) { 52 | db := GetDBInstance() 53 | cast := models.Casts{} 54 | 55 | db.C("casts").FindId(bson.ObjectIdHex(params["Id"])).One(&cast) 56 | 57 | viewCast := models.CastsView{Id: cast.Id.Hex(), 58 | Author: cast.Author, 59 | AuthorUrl: cast.AuthorUrl, 60 | VisitCount: cast.VisitCount, 61 | Title: cast.Title, 62 | LogoUrl: cast.LogoUrl, 63 | Intro: template.HTML(cast.Intro), 64 | ShowNotes: template.HTML(cast.ShowNotes), 65 | Url: cast.Url} 66 | 67 | if db.Session != nil { 68 | defer db.Session.Close() 69 | } 70 | 71 | r.HTML(200, "show", map[string]interface{}{ 72 | "IsCasts": true, 73 | "ViewCast": viewCast}) 74 | } 75 | -------------------------------------------------------------------------------- /routers/index.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "math/rand" 5 | "time" 6 | 7 | "github.com/codegangsta/martini-contrib/render" 8 | "github.com/timothyye/vim-tips-web/models" 9 | ) 10 | 11 | func getRandomIndex(total int) int { 12 | rand.Seed(time.Now().UTC().UnixNano()) 13 | return rand.Intn(total) 14 | } 15 | 16 | func HandleIndex(r render.Render) { 17 | tip := models.Tips{} 18 | 19 | db := GetDBInstance() 20 | total, err := db.C("tips").Count() 21 | 22 | if err != nil || total == 0 { 23 | r.HTML(200, "500", nil) 24 | return 25 | } 26 | 27 | index := getRandomIndex(total) 28 | 29 | if index == total { 30 | index = total - 1 31 | } 32 | 33 | db.C("tips").Find(nil).Skip(index).One(&tip) 34 | 35 | if db.Session != nil { 36 | defer db.Session.Close() 37 | } 38 | 39 | r.HTML(200, "index", map[string]interface{}{ 40 | "Comment": tip.Comment, 41 | "Content": tip.Content, 42 | "Id": tip.Id.Hex(), 43 | "IsIndex": true}) 44 | } 45 | -------------------------------------------------------------------------------- /routers/routers.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | 7 | "github.com/codegangsta/martini-contrib/render" 8 | "github.com/go-martini/martini" 9 | "github.com/martini-contrib/sessions" 10 | "github.com/timothyye/martini-paginate" 11 | "labix.org/v2/mgo" 12 | ) 13 | 14 | func GetDBInstance() *mgo.Database { 15 | session, err := mgo.Dial("mongodb://localhost") 16 | if err != nil { 17 | fmt.Println("Failed to connect to mongo DB...") 18 | } 19 | 20 | return session.DB("vim_tips") 21 | } 22 | 23 | func InitDB() martini.Handler { 24 | session, err := mgo.Dial("mongodb://localhost") 25 | if err != nil { 26 | fmt.Println("Failed to connect to mongo DB...") 27 | panic(err) 28 | } 29 | 30 | return func(res http.ResponseWriter, r *http.Request, c martini.Context) { 31 | c.Map(session.DB("vim_tips")) 32 | } 33 | } 34 | 35 | func Initialize(m *martini.ClassicMartini) { 36 | m.Use(render.Renderer(render.Options{ 37 | Layout: "layout", 38 | Directory: "templates", 39 | Extensions: []string{".tpl", ".html"}, 40 | Charset: "UTF-8", 41 | })) 42 | 43 | store := sessions.NewCookieStore([]byte("vim-tips-secure")) 44 | m.Use(sessions.Sessions("my_session", store)) 45 | 46 | InitConnections() 47 | m.Use(InitDB()) 48 | InitRouters(m) 49 | } 50 | 51 | func InitRouters(m *martini.ClassicMartini) { 52 | //Routers for front pages 53 | m.Get("/", HandleIndex) 54 | m.Get("/tips/:Id", HandleTip) 55 | m.Get("/random_tips/txt", HandleRandomTxtTip) 56 | m.Get("/random_tips/json", HandleRandomJsonTip) 57 | m.Get("/casts", paginate.Handler, HandleCasts) 58 | m.Get("/casts/:Id", ShowCast) 59 | m.Get("/api", HandleAPI) 60 | m.Get("/tools", HandleTools) 61 | m.Get("/about", HandleAbout) 62 | m.Get("/admin/login", ShowLoginPage) 63 | m.Get("/admin/logout", HandleLogout) 64 | m.Post("/admin/login", HandleLogin) 65 | 66 | //Routers for admin panel 67 | m.Group("/admin", func(r martini.Router) { 68 | r.Get("/index", HandleAdminIndex) 69 | r.Get("/tips", paginate.Handler, AdminShowTips) 70 | r.Post("/tips/add", AdminAddTips) 71 | r.Post("/tips/del", AdminDelTips) 72 | r.Post("/tips/update", AdminModifyTips) 73 | r.Get("/casts", paginate.Handler, AdminShowCasts) 74 | r.Get("/password", AdminPassword) 75 | r.Post("/password", AdminUpdatePassword) 76 | r.Get("/casts/add", AdminAddCastsPage) 77 | r.Post("/casts", AdminAddCasts) 78 | r.Post("/casts/del", AdminDelCasts) 79 | r.Post("/casts/modify", AdminUpdateCasts) 80 | r.Get("/casts/modify/:Id", AdminModifyCasts) 81 | }, validateSession) 82 | 83 | } 84 | -------------------------------------------------------------------------------- /routers/tip.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "github.com/codegangsta/martini-contrib/render" 5 | "github.com/go-martini/martini" 6 | "github.com/timothyye/vim-tips-web/models" 7 | "labix.org/v2/mgo/bson" 8 | ) 9 | 10 | func HandleTip(r render.Render, params martini.Params) { 11 | db := GetDBInstance() 12 | tip := models.Tips{} 13 | 14 | db.C("tips").FindId(bson.ObjectIdHex(params["Id"])).One(&tip) 15 | 16 | if db.Session != nil { 17 | defer db.Session.Close() 18 | } 19 | 20 | r.HTML(200, "tip", map[string]interface{}{ 21 | "Comment": tip.Comment, 22 | "Content": tip.Content, 23 | "Id": tip.Id.Hex()}) 24 | } 25 | -------------------------------------------------------------------------------- /routers/tools.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "github.com/codegangsta/martini-contrib/render" 5 | ) 6 | 7 | func HandleTools(r render.Render) { 8 | r.HTML(200, "tools", map[string]interface{}{ 9 | "IsTools": true}) 10 | } 11 | -------------------------------------------------------------------------------- /routers/websocket.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "fmt" 5 | "github.com/gorilla/websocket" 6 | "net/http" 7 | ) 8 | 9 | var connections map[*websocket.Conn]bool 10 | 11 | func InitConnections() { 12 | connections = make(map[*websocket.Conn]bool) 13 | } 14 | 15 | func WSHandler(w http.ResponseWriter, r *http.Request) { 16 | conn, err := websocket.Upgrade(w, r, nil, 1024, 1024) 17 | 18 | if _, ok := err.(websocket.HandshakeError); ok { 19 | http.Error(w, "Not a websocket handleshake", 400) 20 | return 21 | } else if err != nil { 22 | fmt.Println(err) 23 | } 24 | 25 | connections[conn] = true 26 | fmt.Println("A new connection added...") 27 | } 28 | 29 | func sendAll(msg []byte) { 30 | fmt.Println("Send data to all clients...") 31 | for conn := range connections { 32 | if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil { 33 | delete(connections, conn) 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /screenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/screenshots/1.png -------------------------------------------------------------------------------- /screenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/screenshots/2.png -------------------------------------------------------------------------------- /screenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/screenshots/3.png -------------------------------------------------------------------------------- /screenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/screenshots/4.png -------------------------------------------------------------------------------- /screenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimothyYe/vim-tips-web/cf03254a5b4b2bf90b55a56a9c89085b531e1ff9/screenshots/5.png -------------------------------------------------------------------------------- /templates/500.tpl: -------------------------------------------------------------------------------- 1 |
3 | 或许是数据库挂了,稍后再来刷新试试吧…… 4 |
5 | -------------------------------------------------------------------------------- /templates/about.tpl: -------------------------------------------------------------------------------- 1 |Vim是一个功能强大的编辑器,熟练使用Vim,能让你的文本处理和编码效率突飞猛进。不过,Vim拥有众多的命令和使用技巧,你真的都能熟练掌握并运用吗?
5 |Vim-Tips.com 为Vimer提供来自Vim的每日技巧与点滴,让你每天都能学到来自Vim的奇技淫巧,让你的Vim更进一步...
6 |Title | 11 |Author | 12 |Author Url | 13 ||
---|---|---|---|
{{ .Title }} | 20 |{{ .Author }} | 21 |{{ .AuthorUrl }} | 22 | 23 |24 | 33 | | 34 | 35 | 55 |
Tip | 38 |Comments | 39 |Operations | 40 |
---|---|---|
{{ .Content }} | 47 |{{ .Comment }} | 48 | 49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 | |
60 |
61 |
88 |
89 |
109 |