├── .gitignore ├── dist ├── blockrain.zip ├── assets │ └── blocks │ │ └── custom │ │ ├── arrow.png │ │ ├── line.png │ │ ├── square.png │ │ ├── leftHook.png │ │ ├── leftZag.png │ │ ├── rightZag.png │ │ └── rightHook.png ├── blockrain.css ├── README.md └── blockrain.jquery.min.js ├── assets ├── images │ ├── sep.gif │ ├── kite.png │ ├── vimbg.png │ ├── arrow-up.png │ ├── favicon.png │ ├── arrow-down.png │ ├── arrow-left.png │ ├── blockrain.png │ ├── slider-nav.png │ ├── arrow-right.png │ ├── feature-plug.png │ ├── feature-score.png │ ├── feature-speed.png │ ├── icon-sprite.png │ ├── social-card.png │ ├── feature-design.png │ ├── feature-autoplay.png │ ├── feature-responsive.png │ └── logo.svg ├── blocks │ └── custom │ │ ├── arrow.png │ │ ├── line.png │ │ ├── square.png │ │ ├── leftHook.png │ │ ├── leftZag.png │ │ ├── rightZag.png │ │ └── rightHook.png └── css │ ├── .sass-cache │ └── fe2d8acc5283a185af23a78999369ac24d905400 │ │ ├── _base.scssc │ │ ├── _hero.scssc │ │ ├── _vars.scssc │ │ ├── style.scssc │ │ ├── _footer.scssc │ │ ├── _examples.scssc │ │ ├── _features.scssc │ │ ├── _normalize.scssc │ │ └── _game.scssc │ ├── _footer.scss │ ├── style.scss │ ├── _features.scss │ ├── _game.scss │ ├── _vars.scss │ ├── _hero.scss │ ├── styles.css │ ├── _versus.scss │ ├── _base.scss │ ├── _responsive.scss │ ├── _examples.scss │ ├── style.css │ ├── _normalize.scss │ ├── normalize.css │ └── style.css.map ├── Copyright ├── package.json ├── bower.json ├── LICENSE.txt ├── gulpfile.js ├── demo.html ├── src ├── blockrain.css ├── blockrain.jquery.libs.js └── blockrain.jquery.themes.js ├── README.md └── index.html /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | assets/css/.sass-cache/ 3 | .DS_Store -------------------------------------------------------------------------------- /dist/blockrain.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/dist/blockrain.zip -------------------------------------------------------------------------------- /assets/images/sep.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/sep.gif -------------------------------------------------------------------------------- /assets/images/kite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/kite.png -------------------------------------------------------------------------------- /assets/images/vimbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/vimbg.png -------------------------------------------------------------------------------- /assets/images/arrow-up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/arrow-up.png -------------------------------------------------------------------------------- /assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/favicon.png -------------------------------------------------------------------------------- /assets/images/arrow-down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/arrow-down.png -------------------------------------------------------------------------------- /assets/images/arrow-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/arrow-left.png -------------------------------------------------------------------------------- /assets/images/blockrain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/blockrain.png -------------------------------------------------------------------------------- /assets/images/slider-nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/slider-nav.png -------------------------------------------------------------------------------- /assets/blocks/custom/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/blocks/custom/arrow.png -------------------------------------------------------------------------------- /assets/blocks/custom/line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/blocks/custom/line.png -------------------------------------------------------------------------------- /assets/blocks/custom/square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/blocks/custom/square.png -------------------------------------------------------------------------------- /assets/images/arrow-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/arrow-right.png -------------------------------------------------------------------------------- /assets/images/feature-plug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/feature-plug.png -------------------------------------------------------------------------------- /assets/images/feature-score.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/feature-score.png -------------------------------------------------------------------------------- /assets/images/feature-speed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/feature-speed.png -------------------------------------------------------------------------------- /assets/images/icon-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/icon-sprite.png -------------------------------------------------------------------------------- /assets/images/social-card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/social-card.png -------------------------------------------------------------------------------- /assets/blocks/custom/leftHook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/blocks/custom/leftHook.png -------------------------------------------------------------------------------- /assets/blocks/custom/leftZag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/blocks/custom/leftZag.png -------------------------------------------------------------------------------- /assets/blocks/custom/rightZag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/blocks/custom/rightZag.png -------------------------------------------------------------------------------- /assets/images/feature-design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/feature-design.png -------------------------------------------------------------------------------- /assets/blocks/custom/rightHook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/blocks/custom/rightHook.png -------------------------------------------------------------------------------- /assets/images/feature-autoplay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/feature-autoplay.png -------------------------------------------------------------------------------- /assets/images/feature-responsive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/images/feature-responsive.png -------------------------------------------------------------------------------- /dist/assets/blocks/custom/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/dist/assets/blocks/custom/arrow.png -------------------------------------------------------------------------------- /dist/assets/blocks/custom/line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/dist/assets/blocks/custom/line.png -------------------------------------------------------------------------------- /dist/assets/blocks/custom/square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/dist/assets/blocks/custom/square.png -------------------------------------------------------------------------------- /dist/assets/blocks/custom/leftHook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/dist/assets/blocks/custom/leftHook.png -------------------------------------------------------------------------------- /dist/assets/blocks/custom/leftZag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/dist/assets/blocks/custom/leftZag.png -------------------------------------------------------------------------------- /dist/assets/blocks/custom/rightZag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/dist/assets/blocks/custom/rightZag.png -------------------------------------------------------------------------------- /dist/assets/blocks/custom/rightHook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/dist/assets/blocks/custom/rightHook.png -------------------------------------------------------------------------------- /assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_base.scssc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_base.scssc -------------------------------------------------------------------------------- /assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_hero.scssc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_hero.scssc -------------------------------------------------------------------------------- /assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_vars.scssc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_vars.scssc -------------------------------------------------------------------------------- /assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/style.scssc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/style.scssc -------------------------------------------------------------------------------- /assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_footer.scssc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_footer.scssc -------------------------------------------------------------------------------- /assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_examples.scssc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_examples.scssc -------------------------------------------------------------------------------- /assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_features.scssc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_features.scssc -------------------------------------------------------------------------------- /assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_normalize.scssc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gmx/blockrain.js/gh-pages/assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_normalize.scssc -------------------------------------------------------------------------------- /assets/css/_footer.scss: -------------------------------------------------------------------------------- 1 | #footer { 2 | position: relative; 3 | z-index: 1; 4 | text-align: center; 5 | padding-bottom: 60px; 6 | 7 | .buttons { 8 | padding: 20px 0; 9 | .btn {background: #3b3d3b;} 10 | } 11 | 12 | p { 13 | font-size: .85em; 14 | a { 15 | color: #ff7b00; 16 | } 17 | img { 18 | padding: 15px 0; 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /Copyright: -------------------------------------------------------------------------------- 1 | /*! 2 | * BlockRain.js <%= version %> 3 | * jQuery plugin that lets you put a playable (and configurable) game of Tetris in your site or just leave it in auto in the background. 4 | * http://aerolab.github.io/blockrain.js/ 5 | * 6 | * Copyright (c) 2015 Aerolab 7 | * 8 | * Released under the MIT license 9 | * http://aerolab.github.io/blockrain.js/LICENSE.txt 10 | */ 11 | -------------------------------------------------------------------------------- /assets/css/style.scss: -------------------------------------------------------------------------------- 1 | html, body { 2 | background: #3b3d3b; 3 | padding: 0; 4 | margin: 0; 5 | font-family: "Play", "Helvetica Neue", "Arial", sans-serif; 6 | font-weight: normal; 7 | line-height: 160%; 8 | font-size: 16px; 9 | color: #fff; 10 | } 11 | 12 | @import "vars"; 13 | @import "normalize"; 14 | @import "base"; 15 | 16 | @import "hero"; 17 | @import "features"; 18 | @import "examples"; 19 | @import "versus"; 20 | @import "footer"; 21 | 22 | @import "responsive"; -------------------------------------------------------------------------------- /assets/css/_features.scss: -------------------------------------------------------------------------------- 1 | #features { 2 | text-align: center; 3 | padding-bottom: 20px; 4 | 5 | .feature { 6 | width: 280px; 7 | height: 340px; 8 | float: left; 9 | margin: 0; 10 | padding: 0 20px; 11 | box-sizing: border-box; 12 | h2 { 13 | font-weight: normal; 14 | } 15 | p { 16 | color: #898989; 17 | } 18 | } 19 | 20 | &:after { 21 | content: ""; 22 | clear: both; 23 | display: block; 24 | height: 0; 25 | width: 0; 26 | } 27 | } -------------------------------------------------------------------------------- /assets/css/_game.scss: -------------------------------------------------------------------------------- 1 | .game { 2 | position: relative; 3 | } 4 | #tetris-play { 5 | width: 250px; 6 | height: 500px; 7 | margin: 0px auto; 8 | } 9 | 10 | #versus { 11 | .game-holder { 12 | display: inline-block; 13 | vertical-align: middle; 14 | } 15 | .score { 16 | font-size: 36px; 17 | margin-bottom: 20px; 18 | } 19 | .game { 20 | width: 250px; 21 | height: 500px; 22 | } 23 | .vs { 24 | display: inline-block; 25 | font-size: 32px; 26 | padding: 20px; 27 | vertical-align: middle; 28 | } 29 | } -------------------------------------------------------------------------------- /assets/css/.sass-cache/fe2d8acc5283a185af23a78999369ac24d905400/_game.scssc: -------------------------------------------------------------------------------- 1 | 3.4.9 (Selective Steve) 2 | da39a3ee5e6b4b0d3255bfef95601890afd80709 3 | o:Sass::Tree::RootNode 4 | :@children[:@templateI":ET: 5 | @linei:@source_rangeo:Sass::Source::Range :@start_poso:Sass::Source::Position; i: @offseti: @end_poso; ; i;i: 6 | @fileI"_game.scss;T:@importero: Sass::Importers::Filesystem: 7 | @rootI"3/Applications/MAMP/htdocs/tetris.js/assets/css;T:@real_rootI"3/Applications/MAMP/htdocs/tetris.js/assets/css;T:@same_name_warningso:Set: 8 | @hash{: @options{ -------------------------------------------------------------------------------- /assets/css/_vars.scss: -------------------------------------------------------------------------------- 1 | @mixin flex($val) { 2 | flex: $val; 3 | -webkit-flex: $val; 4 | -moz-flex: $val; 5 | } 6 | 7 | @mixin display-flex { 8 | display: flex; 9 | display: -webkit-flex; 10 | -moz-display: flex; 11 | } 12 | 13 | @mixin flex-props($flow, $justify, $content, $items) { 14 | flex-flow: $flow; 15 | justify-content: $justify; 16 | align-content: $content; 17 | align-items: $items; 18 | 19 | -webkit-flex-flow: $flow; 20 | -webkit-justify-content: $justify; 21 | -webkit-align-content: $content; 22 | -webkit-align-items: $items; 23 | 24 | -moz-flex-flow: $flow; 25 | -moz-justify-content: $justify; 26 | -moz-align-content: $content; 27 | -moz-align-items: $items; 28 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blockrain", 3 | "version": "0.2.0", 4 | "description": "Add a game of tetris to your site", 5 | "main": "dist/blockrain.jquery.min.js", 6 | "dependencies": { 7 | "jquery": "~1.11.3" 8 | }, 9 | "devDependencies": { 10 | "gulp": "^3.8.8", 11 | "gulp-clean": "^0.3.1", 12 | "gulp-concat": "^2.4.1", 13 | "gulp-header": "^1.1.1", 14 | "gulp-uglify": "^1.0.1", 15 | "gulp-zip": "~2.0.2", 16 | "run-sequence": "~1.0.2" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "https://github.com/Aerolab/blockrain.js" 21 | }, 22 | "author": "Aerolab", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/Aerolab/blockrain.js/issues" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blockrain", 3 | "version": "0.2.0", 4 | "description": "Add a game of tetris to your site", 5 | "main": "dist/blockrain.jquery.min.js", 6 | "dependencies": { 7 | "jquery": "~1.11.3" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/Aerolab/blockrain.js.git" 12 | }, 13 | "license": "MIT", 14 | "authors": [ 15 | "Aerolab " 16 | ], 17 | "keywords": [ 18 | "tetris", 19 | "blockrain", 20 | "ui", 21 | "game", 22 | "jquery" 23 | ], 24 | "ignore": [ 25 | "assets", 26 | "dist/blockrain.zip", 27 | 28 | ".gitignore", 29 | "Copyright", 30 | "gulpfile.js", 31 | "index.html", 32 | "package.json", 33 | 34 | "node_modules", 35 | "bower_components" 36 | ], 37 | "homepage": "https://github.com/Aerolab/blockrain.js" 38 | } 39 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Aerolab 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /assets/css/_hero.scss: -------------------------------------------------------------------------------- 1 | #hero { 2 | position: relative; 3 | @include display-flex; 4 | @include flex-props(row wrap, center, center, center); 5 | min-height: 500px; 6 | height: 90vh; 7 | color: #fff; 8 | padding: 0; 9 | 10 | .welcome { 11 | position: relative; 12 | z-index: 10; 13 | text-align: center; 14 | margin-bottom: 100px; 15 | } 16 | 17 | h1 { 18 | font-size: 60px; 19 | margin: 0; 20 | 21 | img { 22 | width: 90%; 23 | max-width: 560px; 24 | } 25 | } 26 | 27 | p { 28 | font-size: 1.5em; 29 | margin-bottom: 50px; 30 | } 31 | 32 | &:after { 33 | content: ""; 34 | display: block; 35 | width: 100%; 36 | height: 8px; 37 | background: url(../images/sep.gif) repeat-x center; 38 | position: absolute; 39 | bottom: -12px; 40 | left: 0; 41 | } 42 | .blockrain-score { 43 | border: 2px solid #fff; 44 | text-align: center; 45 | width: 120px; 46 | background: #232323; 47 | 48 | .blockrain-score-msg { 49 | border-bottom: 2px solid #fff; 50 | text-transform: uppercase; 51 | padding: 4px 0; 52 | font-size: .7em; 53 | } 54 | .blockrain-score-num { 55 | font-size: 1.2em; 56 | padding: 3px 0 5px; 57 | } 58 | } 59 | } 60 | 61 | #cover-tetris { 62 | position: absolute; 63 | top: 0; 64 | left: 0; 65 | right: 0; 66 | bottom: 0; 67 | z-index: 0; 68 | } -------------------------------------------------------------------------------- /assets/css/styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | Errno::ENOENT: No such file or directory - styles.scss 3 | 4 | Backtrace: 5 | C:/Ruby193/lib/ruby/gems/1.9.1/gems/sass-3.4.8/lib/sass/plugin/compiler.rb:481:in `read' 6 | C:/Ruby193/lib/ruby/gems/1.9.1/gems/sass-3.4.8/lib/sass/plugin/compiler.rb:481:in `update_stylesheet' 7 | C:/Ruby193/lib/ruby/gems/1.9.1/gems/sass-3.4.8/lib/sass/plugin/compiler.rb:215:in `block in update_stylesheets' 8 | C:/Ruby193/lib/ruby/gems/1.9.1/gems/sass-3.4.8/lib/sass/plugin/compiler.rb:209:in `each' 9 | C:/Ruby193/lib/ruby/gems/1.9.1/gems/sass-3.4.8/lib/sass/plugin/compiler.rb:209:in `update_stylesheets' 10 | C:/Ruby193/lib/ruby/gems/1.9.1/gems/sass-3.4.8/lib/sass/plugin/compiler.rb:293:in `watch' 11 | C:/Ruby193/lib/ruby/gems/1.9.1/gems/sass-3.4.8/lib/sass/plugin.rb:108:in `method_missing' 12 | C:/Ruby193/lib/ruby/gems/1.9.1/gems/sass-3.4.8/lib/sass/exec/sass_scss.rb:370:in `watch_or_update' 13 | C:/Ruby193/lib/ruby/gems/1.9.1/gems/sass-3.4.8/lib/sass/exec/sass_scss.rb:50:in `process_result' 14 | C:/Ruby193/lib/ruby/gems/1.9.1/gems/sass-3.4.8/lib/sass/exec/base.rb:52:in `parse' 15 | C:/Ruby193/lib/ruby/gems/1.9.1/gems/sass-3.4.8/lib/sass/exec/base.rb:19:in `parse!' 16 | C:/Ruby193/lib/ruby/gems/1.9.1/gems/sass-3.4.8/bin/sass:13:in `' 17 | C:/Ruby193/bin/sass:23:in `load' 18 | C:/Ruby193/bin/sass:23:in `
' 19 | */ 20 | body:before { 21 | white-space: pre; 22 | font-family: monospace; 23 | content: "Errno::ENOENT: No such file or directory - styles.scss"; } 24 | -------------------------------------------------------------------------------- /assets/css/_versus.scss: -------------------------------------------------------------------------------- 1 | #versus-arena { 2 | background: #000; 3 | width: 590px; 4 | height: 375px; 5 | border-radius: 50%/5%; 6 | position: relative; 7 | padding-top: 45px; 8 | 9 | &:before { 10 | content: ""; 11 | background: #000; 12 | position: absolute; 13 | top: 5%; 14 | bottom: 5%; 15 | left: -5%; 16 | right: -5%; 17 | border-radius: 5%/50%; 18 | } 19 | .game-holder { 20 | display: inline-block; 21 | vertical-align: middle; 22 | margin: 0 15px; 23 | position: relative; 24 | } 25 | .game { 26 | width: 190px; 27 | height: 330px; 28 | position: static; 29 | } 30 | .score { 31 | position: absolute; 32 | right: 100%; 33 | margin-right: 20px; 34 | color: #c2ffad; 35 | font-size: 20px; 36 | text-align: right; 37 | line-height: 20px; 38 | &:after { 39 | content: "Won"; 40 | display: block; 41 | font-size: 14px; 42 | } 43 | } 44 | .blockrain-score-holder { 45 | color: #c2ffad; 46 | line-height: 20px; 47 | .blockrain-score-num { font-weight: normal; } 48 | } 49 | #tetris-versus-1 { 50 | .blockrain-score-holder { 51 | top: auto; 52 | right: 100%; 53 | bottom: 0px; 54 | margin-right: 20px; 55 | } 56 | } 57 | #tetris-versus-2 { 58 | .blockrain-score-holder { 59 | top: auto; 60 | right: auto; 61 | left: 100%; 62 | bottom: 0px; 63 | margin-left: 20px; 64 | text-align: left; 65 | } 66 | .score { 67 | right: auto; 68 | left: 100%; 69 | text-align: left; 70 | margin-right: 0; 71 | margin-left: 20px; 72 | } 73 | } 74 | } -------------------------------------------------------------------------------- /assets/css/_base.scss: -------------------------------------------------------------------------------- 1 | section { 2 | text-align: center; 3 | padding: 100px 0; 4 | 5 | header { 6 | margin-bottom: 60px; 7 | padding: 0 20px; 8 | h1 { 9 | font-weight: normal; 10 | margin-bottom: 10px; 11 | &:after, &:before { 12 | content: "**********"; 13 | color: #898989; 14 | padding: 0 10px; 15 | font-size: .7em; 16 | } 17 | } 18 | p { 19 | color: #898989; 20 | font-size: 1.2em; 21 | margin-top: 10px; 22 | } 23 | } 24 | article { 25 | width: 100%; 26 | max-width: 840px; 27 | margin: 0 auto; 28 | } 29 | } 30 | 31 | .btn { 32 | border: 2px solid #fff; 33 | color: #fff; 34 | display: inline-block; 35 | padding: 12px 25px 12px 15px; 36 | text-decoration: none; 37 | position: relative; 38 | background: #3b3b3b; 39 | margin: 0 15px; 40 | 41 | &:before { 42 | content: ""; 43 | display: inline-block; 44 | position: relative; 45 | top: 1px; 46 | height: 14px; 47 | width: 14px; 48 | margin-right: 10px; 49 | background: url(../images/icon-sprite.png) no-repeat; 50 | background-size: auto 100%; 51 | } 52 | &.btn-download:before { 53 | background-position: -28px 0; 54 | } 55 | &:after { 56 | content: ""; 57 | position: absolute; 58 | z-index: -1; 59 | width: 100%; 60 | height: 100%; 61 | border: 2px solid #fff; 62 | bottom: -8px; 63 | right: -8px; 64 | } 65 | } 66 | 67 | section.versus { 68 | text-align: center; 69 | padding-top: 100px; 70 | } 71 | 72 | section.versus .game { 73 | display: inline-block; 74 | margin: 0px 20px; 75 | width: 200px; 76 | height: 500px; 77 | } 78 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'), 2 | fs = require('fs'), 3 | clean = require("gulp-clean"), 4 | uglify = require("gulp-uglify"), 5 | concat = require("gulp-concat"), 6 | header = require("gulp-header"), 7 | zip = require("gulp-zip"), 8 | runSequence = require('run-sequence'); 9 | 10 | var getVersion = function () { 11 | info = require("./package.json"); 12 | return info.version; 13 | }; 14 | var getCopyright = function () { 15 | return fs.readFileSync('Copyright'); 16 | }; 17 | 18 | gulp.task('js', function () { 19 | // Concatenate and Minify JS 20 | return gulp.src(['./src/blockrain.jquery.libs.js', './src/blockrain.jquery.src.js', './src/blockrain.jquery.themes.js']) 21 | .pipe(concat('blockrain.jquery.js')) 22 | .pipe(header(getCopyright(), {version: getVersion()})) 23 | .pipe(gulp.dest('./dist')) 24 | .pipe(uglify({preserveComments:'none'})) 25 | .pipe(concat('blockrain.jquery.min.js')) 26 | .pipe(header(getCopyright(), {version: getVersion()})) 27 | .pipe(gulp.dest('./dist')); 28 | }); 29 | 30 | gulp.task('css', function () { 31 | // CSS 32 | return gulp.src(['./src/blockrain.css']) 33 | .pipe(gulp.dest('./dist')); 34 | }); 35 | 36 | gulp.task('blocks', function () { 37 | // CSS 38 | return gulp.src(['./assets/blocks/custom/*.*']) 39 | .pipe(gulp.dest('./dist/assets/blocks/custom')); 40 | }); 41 | 42 | gulp.task('readme', function () { 43 | // Readme 44 | return gulp.src(['./README.md']) 45 | .pipe(gulp.dest('./dist')); 46 | }); 47 | 48 | gulp.task('clean', function () { 49 | return gulp.src('./dist', {read: false}) 50 | .pipe(clean()); 51 | }); 52 | 53 | gulp.task('dist', function () { 54 | // Create a ZIP File 55 | return gulp.src(['./dist/**/*.*']) 56 | .pipe(zip('blockrain.zip')) 57 | .pipe(gulp.dest('./dist')); 58 | }); 59 | 60 | 61 | gulp.task('build', function(callback){ 62 | runSequence('clean', 63 | 'js', 'css', 'blocks', 'readme', 'dist', 64 | callback); 65 | }); 66 | 67 | gulp.task('default', ['build']); 68 | -------------------------------------------------------------------------------- /assets/css/_responsive.scss: -------------------------------------------------------------------------------- 1 | @media (max-width: 840px) { 2 | section { 3 | article { 4 | max-width: 560px; 5 | } 6 | } 7 | } 8 | 9 | @media (max-width: 780px) { 10 | #example-slider { 11 | width: 400px; 12 | } 13 | .example { 14 | height: 340px; 15 | .game { 16 | float: right; 17 | } 18 | } 19 | .example .game .blockrain-start-btn, 20 | .example .game .blockrain-game-over-btn { 21 | left: 50%; 22 | bottom: auto; 23 | top: 50%; 24 | margin-left: -60px; 25 | margin-top: -20px; 26 | } 27 | .example .game .blockrain-start-msg, 28 | .example .game .blockrain-game-over-msg { 29 | top: 50%; 30 | margin-top: -75px; 31 | } 32 | } 33 | 34 | @media (max-width: 640px) { 35 | section header h1 { 36 | &:before, &:after { display: none; } 37 | } 38 | #example-slider { 39 | width: 240px; 40 | height: 460px; 41 | } 42 | .example { 43 | padding-top: 100px; 44 | } 45 | .example .game { float: none; } 46 | .example .instructions { 47 | display: none; 48 | } 49 | .example .game .blockrain-score-holder { 50 | left: auto; 51 | right: 0; 52 | margin-left: 0; 53 | width: 100%; 54 | top: -60px; 55 | z-index: 1; 56 | text-align: right; 57 | } 58 | } 59 | 60 | @media (max-width: 560px) { 61 | section { 62 | article { 63 | max-width: 280px; 64 | } 65 | } 66 | #example-slider { 67 | .buttons { 68 | position: relative; 69 | width: 60%; 70 | margin: 0 auto; 71 | padding-top: 40px; 72 | overflow: hidden; 73 | .btn { 74 | top: 0; 75 | margin: 0; 76 | position: relative; 77 | left: auto; 78 | right: auto; 79 | height: 50px; 80 | width: 28px; 81 | &.btn-prev { float: left; } 82 | &.btn-next { float: right; } 83 | } 84 | } 85 | } 86 | } 87 | @media (max-width: 400px) { 88 | #hero .welcome { 89 | margin-bottom: 0; 90 | padding: 0 20px; 91 | } 92 | #hero .blockrain-score-holder { 93 | display: none !important; 94 | } 95 | #footer { padding: 0 20px; } 96 | #footer p { padding: 0 20px; line-height: 18px; } 97 | #footer .buttons { padding: 10px 0 0 0; } 98 | #hero .btn, #footer .btn { 99 | width: 100%; 100 | margin: 0 0 20px; 101 | box-sizing: border-box; 102 | } 103 | #hero .game { opacity: .07; } 104 | section header { 105 | h1 { font-size: 1.7em; } 106 | p { font-size: 1em; } 107 | } 108 | } -------------------------------------------------------------------------------- /demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Blockrain.js - A Tetris game in HTML5 + Javascript (with autoplay!) 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 |
42 | 43 |
44 |

Check out the demo

45 |
46 | 47 |
48 |
49 |
50 |
51 |
52 |
53 | 54 |
55 | 56 | 57 | 58 | 59 | 60 | 61 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /dist/blockrain.css: -------------------------------------------------------------------------------- 1 | .blockrain-game-holder { 2 | position: relative; 3 | padding: 0; 4 | margin: 0; 5 | color: #ffffff; 6 | font-size: 18px; 7 | line-height: 140%; 8 | } 9 | 10 | /* Touch Controls */ 11 | .blockrain-touch { 12 | position: absolute; 13 | width: 50px; 14 | height: 50px; 15 | display: block; 16 | border-radius: 100%; 17 | border: 1px solid white; 18 | background: rgba(255,255,255,0.2); 19 | z-index: 10; 20 | 21 | -webkit-touch-callout: none; 22 | -webkit-user-select: none; 23 | -moz-user-select: none; 24 | -ms-user-select: none; 25 | user-select: none; 26 | 27 | line-height: 50px; 28 | text-align: center; 29 | } 30 | .blockrain-touch:active { 31 | background: rgba(255,255,255,0.3); 32 | } 33 | 34 | .blockrain-touch-left { 35 | left: -60px; 36 | bottom: 10px; 37 | } 38 | .blockrain-touch-left::after { 39 | content: "<"; 40 | } 41 | .blockrain-touch-right { 42 | right: -60px; 43 | bottom: 10px; 44 | } 45 | .blockrain-touch-right::after { 46 | content: ">"; 47 | } 48 | 49 | .blockrain-touch-rotate-left { 50 | left: -60px; 51 | bottom: 80px; 52 | } 53 | .blockrain-touch-rotate-left::after { 54 | content: ""; 63 | } 64 | 65 | .blockrain-touch-drop { 66 | left: 50%; 67 | margin-left: -25px; 68 | bottom: -60px; 69 | } 70 | .blockrain-touch-drop::after { 71 | content: "."; 72 | } 73 | 74 | /* Buttons */ 75 | .blockrain-btn { 76 | position: relative; 77 | display: inline-block; 78 | background: none; 79 | color: #ffffff; 80 | text-decoration: none; 81 | border: 2px solid #ffffff; 82 | padding: 15px 30px; 83 | font-size: 18px; 84 | text-align: center; 85 | cursor: default; 86 | } 87 | .blockrain-btn::before { 88 | position: absolute; 89 | content: ""; 90 | top: 100%; 91 | left: 0px; 92 | bottom: 0px; 93 | right: 0px; 94 | border: 2px solid #ffffff; 95 | border-top: none; 96 | border-right: none; 97 | transition: all 0.2s ease; 98 | } 99 | .blockrain-btn::after { 100 | position: absolute; 101 | content: ""; 102 | top: 0px; 103 | left: 100%; 104 | bottom: 0px; 105 | right: 0px; 106 | border: 2px solid #ffffff; 107 | border-left: none; 108 | border-bottom: none; 109 | transition: all 0.2s ease; 110 | } 111 | 112 | .blockrain-btn:hover::before { 113 | left: 5px; 114 | bottom: -8px; 115 | right: -8px; 116 | } 117 | .blockrain-btn:hover::after { 118 | top: 5px; 119 | bottom: -8px; 120 | right: -8px; 121 | } 122 | 123 | 124 | /* Score */ 125 | .blockrain-score-holder { 126 | position: absolute; 127 | top: 20px; 128 | right: 20px; 129 | text-align: right; 130 | } 131 | .blockrain-score-msg { 132 | font-size: 14px; 133 | line-height: 100%; 134 | margin-bottom: 0.2em; 135 | } 136 | .blockrain-score-num { 137 | font-size: 20px; 138 | font-weight: bold; 139 | } 140 | 141 | /* Menu */ 142 | .blockrain-start-holder, .blockrain-game-over-holder { 143 | position: absolute; 144 | top: 0; 145 | left: 0; 146 | right: 0; 147 | bottom: 0; 148 | 149 | background: rgba(0,0,0,0.8); 150 | text-align: center; 151 | } 152 | .blockrain-start, .blockrain-game-over { 153 | position: absolute; 154 | top: 50%; 155 | width: 100%; 156 | transform: translateY(-50%); 157 | } 158 | 159 | .blockrain-start-msg, .blockrain-game-over-msg { 160 | font-size: 18px; 161 | margin-bottom: 30px; 162 | } 163 | 164 | -------------------------------------------------------------------------------- /src/blockrain.css: -------------------------------------------------------------------------------- 1 | .blockrain-game-holder { 2 | position: relative; 3 | padding: 0; 4 | margin: 0; 5 | color: #ffffff; 6 | font-size: 18px; 7 | line-height: 140%; 8 | } 9 | 10 | /* Touch Controls */ 11 | .blockrain-touch { 12 | position: absolute; 13 | width: 50px; 14 | height: 50px; 15 | display: block; 16 | border-radius: 100%; 17 | border: 1px solid white; 18 | background: rgba(255,255,255,0.2); 19 | z-index: 10; 20 | 21 | -webkit-touch-callout: none; 22 | -webkit-user-select: none; 23 | -moz-user-select: none; 24 | -ms-user-select: none; 25 | user-select: none; 26 | 27 | line-height: 50px; 28 | text-align: center; 29 | } 30 | .blockrain-touch:active { 31 | background: rgba(255,255,255,0.3); 32 | } 33 | 34 | .blockrain-touch-left { 35 | left: -60px; 36 | bottom: 10px; 37 | } 38 | .blockrain-touch-left::after { 39 | content: "<"; 40 | } 41 | .blockrain-touch-right { 42 | right: -60px; 43 | bottom: 10px; 44 | } 45 | .blockrain-touch-right::after { 46 | content: ">"; 47 | } 48 | 49 | .blockrain-touch-rotate-left { 50 | left: -60px; 51 | bottom: 80px; 52 | } 53 | .blockrain-touch-rotate-left::after { 54 | content: ""; 63 | } 64 | 65 | .blockrain-touch-drop { 66 | left: 50%; 67 | margin-left: -25px; 68 | bottom: -60px; 69 | } 70 | .blockrain-touch-drop::after { 71 | content: "."; 72 | } 73 | 74 | /* Buttons */ 75 | .blockrain-btn { 76 | position: relative; 77 | display: inline-block; 78 | background: none; 79 | color: #ffffff; 80 | text-decoration: none; 81 | border: 2px solid #ffffff; 82 | padding: 15px 30px; 83 | font-size: 18px; 84 | text-align: center; 85 | cursor: default; 86 | } 87 | .blockrain-btn::before { 88 | position: absolute; 89 | content: ""; 90 | top: 100%; 91 | left: 0px; 92 | bottom: 0px; 93 | right: 0px; 94 | border: 2px solid #ffffff; 95 | border-top: none; 96 | border-right: none; 97 | transition: all 0.2s ease; 98 | } 99 | .blockrain-btn::after { 100 | position: absolute; 101 | content: ""; 102 | top: 0px; 103 | left: 100%; 104 | bottom: 0px; 105 | right: 0px; 106 | border: 2px solid #ffffff; 107 | border-left: none; 108 | border-bottom: none; 109 | transition: all 0.2s ease; 110 | } 111 | 112 | .blockrain-btn:hover::before { 113 | left: 5px; 114 | bottom: -8px; 115 | right: -8px; 116 | } 117 | .blockrain-btn:hover::after { 118 | top: 5px; 119 | bottom: -8px; 120 | right: -8px; 121 | } 122 | 123 | 124 | /* Score */ 125 | .blockrain-score-holder { 126 | position: absolute; 127 | top: 20px; 128 | right: 20px; 129 | text-align: right; 130 | } 131 | .blockrain-score-msg { 132 | font-size: 14px; 133 | line-height: 100%; 134 | margin-bottom: 0.2em; 135 | } 136 | .blockrain-score-num { 137 | font-size: 20px; 138 | font-weight: bold; 139 | } 140 | 141 | /* Menu */ 142 | .blockrain-start-holder, .blockrain-game-over-holder { 143 | position: absolute; 144 | top: 0; 145 | left: 0; 146 | right: 0; 147 | bottom: 0; 148 | 149 | background: rgba(0,0,0,0.8); 150 | text-align: center; 151 | } 152 | .blockrain-start, .blockrain-game-over { 153 | position: absolute; 154 | top: 50%; 155 | width: 100%; 156 | transform: translateY(-50%); 157 | } 158 | 159 | .blockrain-start-msg, .blockrain-game-over-msg { 160 | font-size: 18px; 161 | margin-bottom: 30px; 162 | } 163 | 164 | -------------------------------------------------------------------------------- /assets/css/_examples.scss: -------------------------------------------------------------------------------- 1 | #examples { 2 | padding-top: 0px; 3 | .buttons { 4 | .btn { 5 | display: block; 6 | width: 35px; 7 | height: 63px; 8 | padding: 0; 9 | position: absolute; 10 | background: url(../images/slider-nav.png) no-repeat; 11 | background-size: auto 100%; 12 | border: none; 13 | top: 50%; 14 | margin-top: -30px; 15 | overflow: hidden; 16 | text-indent: -9999px; 17 | } 18 | .btn-prev { 19 | right: 100%; 20 | margin-right: 70px; 21 | } 22 | .btn-next { 23 | left: 100%; 24 | margin-left: 70px; 25 | background-position: right; 26 | } 27 | } 28 | } 29 | #example-slider { 30 | background: #000; 31 | width: 590px; 32 | height: 420px; 33 | border-radius: 50%/5%; 34 | position: relative; 35 | 36 | &:before { 37 | content: ""; 38 | background: #000; 39 | position: absolute; 40 | top: 5%; 41 | bottom: 5%; 42 | left: -5%; 43 | right: -5%; 44 | border-radius: 5%/50%; 45 | } 46 | } 47 | 48 | .example { 49 | padding: 50px 0 0 0; 50 | color: #c2ffad; 51 | position: relative; 52 | .game { 53 | display: inline-block; 54 | margin: 0px 20px; 55 | width: 200px; 56 | height: 330px; 57 | position: static; 58 | .blockrain-score-holder { 59 | left: 100%; 60 | top: -10px; 61 | right: auto; 62 | text-align: left; 63 | margin-left: 55px; 64 | font-size: 14px; 65 | color: #c2ffad; 66 | line-height: 20px; 67 | 68 | .blockrain-score-num { 69 | font-size: 24px; 70 | font-weight: normal; 71 | } 72 | } 73 | .blockrain-start, .blockrain-game-over { 74 | top: auto; 75 | transform: none; 76 | height: 100%; 77 | } 78 | .blockrain-start-msg, .blockrain-game-over-msg { 79 | color: #c2ffad; 80 | font-size: 14px; 81 | position: absolute; 82 | top: -16px; 83 | width: 100%; 84 | } 85 | .blockrain-game-over-msg { 86 | top: 50%; 87 | font-size: 24px; 88 | margin-top: -24px; 89 | } 90 | .blockrain-start-btn, .blockrain-game-over-btn { 91 | position: absolute; 92 | left: 100%; 93 | bottom: 3px; 94 | border: none; 95 | background: #c2ffad; 96 | color: #000; 97 | text-transform: uppercase; 98 | font-weight: bold; 99 | margin-left: 55px; 100 | width: 120px; 101 | padding: 13px 0; 102 | font-size: 16px; 103 | &:before, &:after { display: none; } 104 | } 105 | } 106 | .theme { 107 | position: absolute; 108 | top: 36px; 109 | left: 20px; 110 | font-size: 14px; 111 | line-height: 20px; 112 | text-align: left; 113 | strong { 114 | display: block; 115 | font-size: 24px; 116 | font-weight: normal; 117 | } 118 | } 119 | .instructions { 120 | position: absolute; 121 | bottom: 10px; 122 | left: 20px; 123 | overflow: hidden; 124 | font-size: 14px; 125 | 126 | .key { 127 | border: 1px solid #c2ffad; 128 | display: block; 129 | width: 38px; 130 | height: 38px; 131 | float: left; 132 | position: relative; 133 | &:before { 134 | content: ""; 135 | display: block; 136 | width: 14px; 137 | height: 14px; 138 | position: absolute; 139 | top: 50%; 140 | left: 50%; 141 | margin: -7px 0 0 -7px; 142 | background: url(../images/icon-sprite.png) no-repeat; 143 | background-position: -84px 0; 144 | background-size: auto 100%; 145 | } 146 | &.key-up { 147 | float: none; 148 | margin-left: 39px; 149 | border-bottom: none; 150 | margin-top: 20px; 151 | &:before { background-position: -42px 0; } 152 | } 153 | &.key-left:before { background-position: -56px 0; } 154 | &.key-down { 155 | border-left: none; 156 | border-right: none; 157 | &:before { background-position: -70px 0; } 158 | } 159 | } 160 | } 161 | } -------------------------------------------------------------------------------- /src/blockrain.jquery.libs.js: -------------------------------------------------------------------------------- 1 | // jQuery Widget 2 | (function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){var t=0,i=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var s,n,a=i.call(arguments,1),o=0,r=a.length;r>o;o++)for(s in a[o])n=a[o][s],a[o].hasOwnProperty(s)&&void 0!==n&&(t[s]=e.isPlainObject(n)?e.isPlainObject(t[s])?e.widget.extend({},t[s],n):e.widget.extend({},n):n);return t},e.widget.bridge=function(t,s){var n=s.prototype.widgetFullName||t;e.fn[t]=function(a){var o="string"==typeof a,r=i.call(arguments,1),h=this;return a=!o&&r.length?e.widget.extend.apply(null,[a].concat(r)):a,o?this.each(function(){var i,s=e.data(this,n);return"instance"===a?(h=s,!1):s?e.isFunction(s[a])&&"_"!==a.charAt(0)?(i=s[a].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+a+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+a+"'")}):this.each(function(){var t=e.data(this,n);t?(t.option(a||{}),t._init&&t._init()):e.data(this,n,new s(a,this))}),h}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{disabled:!1,create:null},_createWidget:function(i,s){s=e(s||this.defaultElement||this)[0],this.element=e(s),this.uuid=t++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),s!==this&&(e.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===s&&this.destroy()}}),this.document=e(s.style?s.ownerDocument:s.document||s),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget}); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Blockrain.js 2 | ============ 3 | 4 | A tetris game in HTML5 + Javascript (with autoplay!) 5 | 6 | **[Check out the demo](http://aerolab.github.io/blockrain.js/)** 7 | 8 | ![Blockrain Screenshot](http://aerolab.github.io/blockrain.js/assets/images/blockrain.png) 9 | 10 | 11 | # Setup 12 | 13 | Create any element (a div, article, figure, whatever you want) and **make sure it has a width and a height set via CSS** . You can use any class, but we are using *.game* for this example. 14 | 15 | ```html 16 |
17 | ``` 18 | 19 | Then you just include **jquery** and **blockrain** and setup the game with **$('.game').blockrain()**. Adding the CSS file is *strongly recommended*, as it provides some important styles for the UI (but you can customize them as needed). 20 | 21 | 22 | ```html 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | ``` 33 | 34 | For extra fun, you can **enable continuous autoplay**, so the game plays itself continuously: 35 | 36 | ```js 37 | $('.game').blockrain({ autoplay: true, autoplayRestart: true }); 38 | ``` 39 | 40 | # Themes 41 | 42 | Blockrain comes with many themes out-of-the-box, but you can create custom ones by **adding them to BlockrainThemes**. You have multiple settings and can even use **custom textures** (base64-encoded). 43 | 44 | ```js 45 | { 46 | background: '#000000', // The main background color. 47 | backgroundGrid: '#101010', // You can draw a small background grid as well. 48 | primary: null, // Color of the falling blocks. This overrides the standard block color. 49 | secondary: null, // Color of the placed blocks. This overrides the standard block color. 50 | stroke: null, // Border color for the blocks. 51 | innerStroke: null, // A small border inside the blocks to give some texture. 52 | 53 | // The following are the colors of each piece 54 | blocks: { 55 | line: '#fa1e1e', 56 | square: '#f1fa1e', 57 | arrow: '#d838cb', 58 | rightHook:'#f5821f', 59 | leftHook: '#42c6f0', 60 | rightZag: '#4bd838', 61 | leftZag: '#fa1e1e' 62 | } 63 | } 64 | ``` 65 | 66 | Here's an example of a retro theme (vim) with a **custom texture**: 67 | 68 | ```js 69 | { 70 | background: '#000000', 71 | backgroundGrid: 'data:image/png;base64,iVBORw0KGgoAAA{AND SO ON}', 72 | primary: '#C2FFAE', 73 | secondary: '#C2FFAE', 74 | stroke: '#000000', 75 | strokeWidth: 3, 76 | innerStroke: null 77 | } 78 | ``` 79 | 80 | 81 | ### Creating custom designs 82 | 83 | You can now use **completely custom designs for each block**! You just link to one image for each block when creating your theme and the plugin takes care of the rest. You can even use lists of images if you want BlockRain to pick a random design for each block. 84 | 85 | **Keep in mind that the images need to follow the exact same format (rotation and width/height ratio) as [the blocks that are bundled with the custom theme](https://github.com/Aerolab/blockrain.js/tree/gh-pages/assets/blocks/custom)**. 86 | 87 | Fun fact: Now you can rotate the square! 88 | 89 | 90 | ```js 91 | 'custom': { 92 | background: '#040304', 93 | backgroundGrid: '#000', 94 | complexBlocks: { 95 | line: ['assets/blocks/custom/line.png', 'assets/blocks/custom/line.png'], 96 | square: 'assets/blocks/custom/square.png', 97 | arrow: 'assets/blocks/custom/arrow.png', 98 | rightHook:'assets/blocks/custom/rightHook.png', 99 | leftHook: 'assets/blocks/custom/leftHook.png', 100 | rightZag: 'assets/blocks/custom/rightZag.png', 101 | leftZag: 'assets/blocks/custom/leftZag.png' 102 | } 103 | } 104 | ``` 105 | 106 | 107 | ### Available themes: 108 | 109 | * custom **NEW!** 110 | * candy 111 | * modern 112 | * retro 113 | * vim 114 | * monochrome 115 | * gameboy 116 | * aerolab 117 | 118 | Remember you can create custom themes or modify these to better suit your design needs. 119 | 120 | 121 | # Options 122 | 123 | Blockrain comes with many options to help customize the game: 124 | 125 | ```js 126 | { 127 | autoplay: false, // Let a bot play the game 128 | autoplayRestart: true, // Restart the game automatically once a bot loses 129 | showFieldOnStart: true, // Show a bunch of random blocks on the start screen (it looks nice) 130 | theme: null, // The theme name or a theme object 131 | blockWidth: 10, // How many blocks wide the field is (The standard is 10 blocks) 132 | autoBlockWidth: false, // The blockWidth is dinamically calculated based on the autoBlockSize. Disabled blockWidth. Useful for responsive backgrounds 133 | autoBlockSize: 24, // The max size of a block for autowidth mode 134 | difficulty: 'normal', // Difficulty (normal|nice|evil). 135 | speed: 20, // The speed of the game. The higher, the faster the pieces go. 136 | 137 | // Copy 138 | playText: 'Let\'s play some Tetris', 139 | playButtonText: 'Play', 140 | gameOverText: 'Game Over', 141 | restartButtonText: 'Play Again', 142 | scoreText: 'Score', 143 | 144 | // Basic Callbacks 145 | onStart: function(){}, 146 | onRestart: function(){}, 147 | onGameOver: function(score){}, 148 | 149 | // When a line is made. Returns the number of lines, score assigned and total score 150 | onLine: function(lines, scoreIncrement, score){} 151 | } 152 | ``` 153 | 154 | # Methods 155 | 156 | There are a few utility methods available to control the game. $game represents your game selector (like *$('.game')*, for example). 157 | 158 | ```js 159 | // Start the game 160 | $game.blockrain('start'); 161 | 162 | // Restart the game 163 | $game.blockrain('restart'); 164 | 165 | // Trigger a game over 166 | $game.blockrain('gameover'); 167 | ``` 168 | 169 | 170 | ```js 171 | // Pause 172 | $game.blockrain('pause'); 173 | 174 | // Resume 175 | $game.blockrain('resume'); 176 | ``` 177 | 178 | ```js 179 | // Enable or Disable Autoplay (true|false) 180 | $game.blockrain('autoplay', true); 181 | ``` 182 | 183 | ```js 184 | // Enable or Disable Controls (true|false) 185 | $game.blockrain('controls', true); 186 | ``` 187 | 188 | ```js 189 | // Change the theme. 190 | 191 | // You can provide a theme name... 192 | $game.blockrain('theme', 'vim'); 193 | 194 | // Or a theme object. **Check out src/blockrain.jquery.themes.js** for examples. 195 | $game.blockrain('theme', { 196 | background: '#ffffff', 197 | primary: '#ff7b00', 198 | secondary: '#000000' 199 | }); 200 | ``` 201 | 202 | ```js 203 | // Return the current score 204 | var score = $game.blockrain('score'); 205 | ``` 206 | 207 | 208 | # Building Blockrain.js 209 | 210 | This will generate the full minified source under /build . It's basically License + libs + themes + src, concatenated and minified. 211 | 212 | ```gulp build``` 213 | 214 | 215 | # Credits 216 | 217 | Blockrain.js is based on the [work by @mrcoles](http://mrcoles.com/tetris/), which is one of the best HTML5 tetris versions out there. The code was then modified and refactored to build a jQuery Plugin and added quite a few methods to easily add themes to it and make it simpler to implement. 218 | -------------------------------------------------------------------------------- /dist/README.md: -------------------------------------------------------------------------------- 1 | Blockrain.js 2 | ============ 3 | 4 | A tetris game in HTML5 + Javascript (with autoplay!) 5 | 6 | **[Check out the demo](http://aerolab.github.io/blockrain.js/)** 7 | 8 | ![Blockrain Screenshot](http://aerolab.github.io/blockrain.js/assets/images/blockrain.png) 9 | 10 | 11 | # Setup 12 | 13 | Create any element (a div, article, figure, whatever you want) and **make sure it has a width and a height set via CSS** . You can use any class, but we are using *.game* for this example. 14 | 15 | ```html 16 |
17 | ``` 18 | 19 | Then you just include **jquery** and **blockrain** and setup the game with **$('.game').blockrain()**. Adding the CSS file is *strongly recommended*, as it provides some important styles for the UI (but you can customize them as needed). 20 | 21 | 22 | ```html 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | ``` 33 | 34 | For extra fun, you can **enable continuous autoplay**, so the game plays itself continuously: 35 | 36 | ```js 37 | $('.game').blockrain({ autoplay: true, autoplayRestart: true }); 38 | ``` 39 | 40 | # Themes 41 | 42 | Blockrain comes with many themes out-of-the-box, but you can create custom ones by **adding them to BlockrainThemes**. You have multiple settings and can even use **custom textures** (base64-encoded). 43 | 44 | ```js 45 | { 46 | background: '#000000', // The main background color. 47 | backgroundGrid: '#101010', // You can draw a small background grid as well. 48 | primary: null, // Color of the falling blocks. This overrides the standard block color. 49 | secondary: null, // Color of the placed blocks. This overrides the standard block color. 50 | stroke: null, // Border color for the blocks. 51 | innerStroke: null, // A small border inside the blocks to give some texture. 52 | 53 | // The following are the colors of each piece 54 | blocks: { 55 | line: '#fa1e1e', 56 | square: '#f1fa1e', 57 | arrow: '#d838cb', 58 | rightHook:'#f5821f', 59 | leftHook: '#42c6f0', 60 | rightZag: '#4bd838', 61 | leftZag: '#fa1e1e' 62 | } 63 | } 64 | ``` 65 | 66 | Here's an example of a retro theme (vim) with a **custom texture**: 67 | 68 | ```js 69 | { 70 | background: '#000000', 71 | backgroundGrid: 'data:image/png;base64,iVBORw0KGgoAAA{AND SO ON}', 72 | primary: '#C2FFAE', 73 | secondary: '#C2FFAE', 74 | stroke: '#000000', 75 | strokeWidth: 3, 76 | innerStroke: null 77 | } 78 | ``` 79 | 80 | 81 | ### Creating custom designs 82 | 83 | You can now use **completely custom designs for each block**! You just link to one image for each block when creating your theme and the plugin takes care of the rest. You can even use lists of images if you want BlockRain to pick a random design for each block. 84 | 85 | **Keep in mind that the images need to follow the exact same format (rotation and width/height ratio) as [the blocks that are bundled with the custom theme](https://github.com/Aerolab/blockrain.js/tree/gh-pages/assets/blocks/custom)**. 86 | 87 | Fun fact: Now you can rotate the square! 88 | 89 | 90 | ```js 91 | 'custom': { 92 | background: '#040304', 93 | backgroundGrid: '#000', 94 | complexBlocks: { 95 | line: ['assets/blocks/custom/line.png', 'assets/blocks/custom/line.png'], 96 | square: 'assets/blocks/custom/square.png', 97 | arrow: 'assets/blocks/custom/arrow.png', 98 | rightHook:'assets/blocks/custom/rightHook.png', 99 | leftHook: 'assets/blocks/custom/leftHook.png', 100 | rightZag: 'assets/blocks/custom/rightZag.png', 101 | leftZag: 'assets/blocks/custom/leftZag.png' 102 | } 103 | } 104 | ``` 105 | 106 | 107 | ### Available themes: 108 | 109 | * custom **NEW!** 110 | * candy 111 | * modern 112 | * retro 113 | * vim 114 | * monochrome 115 | * gameboy 116 | * aerolab 117 | 118 | Remember you can create custom themes or modify these to better suit your design needs. 119 | 120 | 121 | # Options 122 | 123 | Blockrain comes with many options to help customize the game: 124 | 125 | ```js 126 | { 127 | autoplay: false, // Let a bot play the game 128 | autoplayRestart: true, // Restart the game automatically once a bot loses 129 | showFieldOnStart: true, // Show a bunch of random blocks on the start screen (it looks nice) 130 | theme: null, // The theme name or a theme object 131 | blockWidth: 10, // How many blocks wide the field is (The standard is 10 blocks) 132 | autoBlockWidth: false, // The blockWidth is dinamically calculated based on the autoBlockSize. Disabled blockWidth. Useful for responsive backgrounds 133 | autoBlockSize: 24, // The max size of a block for autowidth mode 134 | difficulty: 'normal', // Difficulty (normal|nice|evil). 135 | speed: 20, // The speed of the game. The higher, the faster the pieces go. 136 | 137 | // Copy 138 | playText: 'Let\'s play some Tetris', 139 | playButtonText: 'Play', 140 | gameOverText: 'Game Over', 141 | restartButtonText: 'Play Again', 142 | scoreText: 'Score', 143 | 144 | // Basic Callbacks 145 | onStart: function(){}, 146 | onRestart: function(){}, 147 | onGameOver: function(score){}, 148 | 149 | // When a line is made. Returns the number of lines, score assigned and total score 150 | onLine: function(lines, scoreIncrement, score){} 151 | } 152 | ``` 153 | 154 | # Methods 155 | 156 | There are a few utility methods available to control the game. $game represents your game selector (like *$('.game')*, for example). 157 | 158 | ```js 159 | // Start the game 160 | $game.blockrain('start'); 161 | 162 | // Restart the game 163 | $game.blockrain('restart'); 164 | 165 | // Trigger a game over 166 | $game.blockrain('gameover'); 167 | ``` 168 | 169 | 170 | ```js 171 | // Pause 172 | $game.blockrain('pause'); 173 | 174 | // Resume 175 | $game.blockrain('resume'); 176 | ``` 177 | 178 | ```js 179 | // Enable or Disable Autoplay (true|false) 180 | $game.blockrain('autoplay', true); 181 | ``` 182 | 183 | ```js 184 | // Enable or Disable Controls (true|false) 185 | $game.blockrain('controls', true); 186 | ``` 187 | 188 | ```js 189 | // Change the theme. 190 | 191 | // You can provide a theme name... 192 | $game.blockrain('theme', 'vim'); 193 | 194 | // Or a theme object. **Check out src/blockrain.jquery.themes.js** for examples. 195 | $game.blockrain('theme', { 196 | background: '#ffffff', 197 | primary: '#ff7b00', 198 | secondary: '#000000' 199 | }); 200 | ``` 201 | 202 | ```js 203 | // Return the current score 204 | var score = $game.blockrain('score'); 205 | ``` 206 | 207 | 208 | # Building Blockrain.js 209 | 210 | This will generate the full minified source under /build . It's basically License + libs + themes + src, concatenated and minified. 211 | 212 | ```gulp build``` 213 | 214 | 215 | # Credits 216 | 217 | Blockrain.js is based on the [work by @mrcoles](http://mrcoles.com/tetris/), which is one of the best HTML5 tetris versions out there. The code was then modified and refactored to build a jQuery Plugin and added quite a few methods to easily add themes to it and make it simpler to implement. 218 | -------------------------------------------------------------------------------- /assets/css/style.css: -------------------------------------------------------------------------------- 1 | html,body{background:#3b3d3b;padding:0;margin:0;font-family:"Play", "Helvetica Neue", "Arial", sans-serif;font-weight:normal;line-height:160%;font-size:16px;color:#fff}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}section{text-align:center;padding:100px 0}section header{margin-bottom:60px;padding:0 20px}section header h1{font-weight:normal;margin-bottom:10px}section header h1:after,section header h1:before{content:"**********";color:#898989;padding:0 10px;font-size:.7em}section header p{color:#898989;font-size:1.2em;margin-top:10px}section article{width:100%;max-width:840px;margin:0 auto}.btn{border:2px solid #fff;color:#fff;display:inline-block;padding:12px 25px 12px 15px;text-decoration:none;position:relative;background:#3b3b3b;margin:0 15px}.btn:before{content:"";display:inline-block;position:relative;top:1px;height:14px;width:14px;margin-right:10px;background:url(../images/icon-sprite.png) no-repeat;background-size:auto 100%}.btn.btn-download:before{background-position:-28px 0}.btn:after{content:"";position:absolute;z-index:-1;width:100%;height:100%;border:2px solid #fff;bottom:-8px;right:-8px}section.versus{text-align:center;padding-top:100px}section.versus .game{display:inline-block;margin:0px 20px;width:200px;height:500px}#hero{position:relative;display:flex;display:-webkit-flex;-moz-display:flex;flex-flow:row wrap;justify-content:center;align-content:center;align-items:center;-webkit-flex-flow:row wrap;-webkit-justify-content:center;-webkit-align-content:center;-webkit-align-items:center;-moz-flex-flow:row wrap;-moz-justify-content:center;-moz-align-content:center;-moz-align-items:center;min-height:500px;height:90vh;color:#fff;padding:0}#hero .welcome{position:relative;z-index:10;text-align:center;margin-bottom:100px}#hero h1{font-size:60px;margin:0}#hero h1 img{width:90%;max-width:560px}#hero p{font-size:1.5em;margin-bottom:50px}#hero:after{content:"";display:block;width:100%;height:8px;background:url(../images/sep.gif) repeat-x center;position:absolute;bottom:-12px;left:0}#hero .blockrain-score{border:2px solid #fff;text-align:center;width:120px;background:#232323}#hero .blockrain-score .blockrain-score-msg{border-bottom:2px solid #fff;text-transform:uppercase;padding:4px 0;font-size:.7em}#hero .blockrain-score .blockrain-score-num{font-size:1.2em;padding:3px 0 5px}#cover-tetris{position:absolute;top:0;left:0;right:0;bottom:0;z-index:0}#features{text-align:center;padding-bottom:20px}#features .feature{width:280px;height:340px;float:left;margin:0;padding:0 20px;box-sizing:border-box}#features .feature h2{font-weight:normal}#features .feature p{color:#898989}#features:after{content:"";clear:both;display:block;height:0;width:0}#examples{padding-top:0px}#examples .buttons .btn{display:block;width:35px;height:63px;padding:0;position:absolute;background:url(../images/slider-nav.png) no-repeat;background-size:auto 100%;border:none;top:50%;margin-top:-30px;overflow:hidden;text-indent:-9999px}#examples .buttons .btn-prev{right:100%;margin-right:70px}#examples .buttons .btn-next{left:100%;margin-left:70px;background-position:right}#example-slider{background:#000;width:590px;height:420px;border-radius:50%/5%;position:relative}#example-slider:before{content:"";background:#000;position:absolute;top:5%;bottom:5%;left:-5%;right:-5%;border-radius:5%/50%}.example{padding:50px 0 0 0;color:#c2ffad;position:relative}.example .game{display:inline-block;margin:0px 20px;width:200px;height:330px;position:static}.example .game .blockrain-score-holder{left:100%;top:-10px;right:auto;text-align:left;margin-left:55px;font-size:14px;color:#c2ffad;line-height:20px}.example .game .blockrain-score-holder .blockrain-score-num{font-size:24px;font-weight:normal}.example .game .blockrain-start,.example .game .blockrain-game-over{top:auto;transform:none;height:100%}.example .game .blockrain-start-msg,.example .game .blockrain-game-over-msg{color:#c2ffad;font-size:14px;position:absolute;top:-16px;width:100%}.example .game .blockrain-game-over-msg{top:50%;font-size:24px;margin-top:-24px}.example .game .blockrain-start-btn,.example .game .blockrain-game-over-btn{position:absolute;left:100%;bottom:3px;border:none;background:#c2ffad;color:#000;text-transform:uppercase;font-weight:bold;margin-left:55px;width:120px;padding:13px 0;font-size:16px}.example .game .blockrain-start-btn:before,.example .game .blockrain-start-btn:after,.example .game .blockrain-game-over-btn:before,.example .game .blockrain-game-over-btn:after{display:none}.example .theme{position:absolute;top:36px;left:20px;font-size:14px;line-height:20px;text-align:left}.example .theme strong{display:block;font-size:24px;font-weight:normal}.example .instructions{position:absolute;bottom:10px;left:20px;overflow:hidden;font-size:14px}.example .instructions .key{border:1px solid #c2ffad;display:block;width:38px;height:38px;float:left;position:relative}.example .instructions .key:before{content:"";display:block;width:14px;height:14px;position:absolute;top:50%;left:50%;margin:-7px 0 0 -7px;background:url(../images/icon-sprite.png) no-repeat;background-position:-84px 0;background-size:auto 100%}.example .instructions .key.key-up{float:none;margin-left:39px;border-bottom:none;margin-top:20px}.example .instructions .key.key-up:before{background-position:-42px 0}.example .instructions .key.key-left:before{background-position:-56px 0}.example .instructions .key.key-down{border-left:none;border-right:none}.example .instructions .key.key-down:before{background-position:-70px 0}#versus-arena{background:#000;width:590px;height:375px;border-radius:50%/5%;position:relative;padding-top:45px}#versus-arena:before{content:"";background:#000;position:absolute;top:5%;bottom:5%;left:-5%;right:-5%;border-radius:5%/50%}#versus-arena .game-holder{display:inline-block;vertical-align:middle;margin:0 15px;position:relative}#versus-arena .game{width:190px;height:330px;position:static}#versus-arena .score{position:absolute;right:100%;margin-right:20px;color:#c2ffad;font-size:20px;text-align:right;line-height:20px}#versus-arena .score:after{content:"Won";display:block;font-size:14px}#versus-arena .blockrain-score-holder{color:#c2ffad;line-height:20px}#versus-arena .blockrain-score-holder .blockrain-score-num{font-weight:normal}#versus-arena #tetris-versus-1 .blockrain-score-holder{top:auto;right:100%;bottom:0px;margin-right:20px}#versus-arena #tetris-versus-2 .blockrain-score-holder{top:auto;right:auto;left:100%;bottom:0px;margin-left:20px;text-align:left}#versus-arena #tetris-versus-2 .score{right:auto;left:100%;text-align:left;margin-right:0;margin-left:20px}#footer{position:relative;z-index:1;text-align:center;padding-bottom:60px}#footer .buttons{padding:20px 0}#footer .buttons .btn{background:#3b3d3b}#footer p{font-size:.85em}#footer p a{color:#ff7b00}#footer p img{padding:15px 0}@media (max-width: 840px){section article{max-width:560px}}@media (max-width: 780px){#example-slider{width:400px}.example{height:340px}.example .game{float:right}.example .game .blockrain-start-btn,.example .game .blockrain-game-over-btn{left:50%;bottom:auto;top:50%;margin-left:-60px;margin-top:-20px}.example .game .blockrain-start-msg,.example .game .blockrain-game-over-msg{top:50%;margin-top:-75px}}@media (max-width: 640px){section header h1:before,section header h1:after{display:none}#example-slider{width:240px;height:460px}.example{padding-top:100px}.example .game{float:none}.example .instructions{display:none}.example .game .blockrain-score-holder{left:auto;right:0;margin-left:0;width:100%;top:-60px;z-index:1;text-align:right}}@media (max-width: 560px){section article{max-width:280px}#example-slider .buttons{position:relative;width:60%;margin:0 auto;padding-top:40px;overflow:hidden}#example-slider .buttons .btn{top:0;margin:0;position:relative;left:auto;right:auto;height:50px;width:28px}#example-slider .buttons .btn.btn-prev{float:left}#example-slider .buttons .btn.btn-next{float:right}}@media (max-width: 400px){#hero .welcome{margin-bottom:0;padding:0 20px}#hero .blockrain-score-holder{display:none !important}#footer{padding:0 20px}#footer p{padding:0 20px;line-height:18px}#footer .buttons{padding:10px 0 0 0}#hero .btn,#footer .btn{width:100%;margin:0 0 20px;box-sizing:border-box}#hero .game{opacity:.07}section header h1{font-size:1.7em}section header p{font-size:1em}} 2 | /*# sourceMappingURL=style.css.map */ 3 | -------------------------------------------------------------------------------- /assets/css/_normalize.scss: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.1 | MIT License | git.io/normalize */ 2 | 3 | /** 4 | * 1. Set default font family to sans-serif. 5 | * 2. Prevent iOS text size adjust after orientation change, without disabling 6 | * user zoom. 7 | */ 8 | 9 | html { 10 | font-family: sans-serif; /* 1 */ 11 | -ms-text-size-adjust: 100%; /* 2 */ 12 | -webkit-text-size-adjust: 100%; /* 2 */ 13 | } 14 | 15 | /** 16 | * Remove default margin. 17 | */ 18 | 19 | body { 20 | margin: 0; 21 | } 22 | 23 | /* HTML5 display definitions 24 | ========================================================================== */ 25 | 26 | /** 27 | * Correct `block` display not defined for any HTML5 element in IE 8/9. 28 | * Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox. 29 | * Correct `block` display not defined for `main` in IE 11. 30 | */ 31 | 32 | article, 33 | aside, 34 | details, 35 | figcaption, 36 | figure, 37 | footer, 38 | header, 39 | hgroup, 40 | main, 41 | nav, 42 | section, 43 | summary { 44 | display: block; 45 | } 46 | 47 | /** 48 | * 1. Correct `inline-block` display not defined in IE 8/9. 49 | * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. 50 | */ 51 | 52 | audio, 53 | canvas, 54 | progress, 55 | video { 56 | display: inline-block; /* 1 */ 57 | vertical-align: baseline; /* 2 */ 58 | } 59 | 60 | /** 61 | * Prevent modern browsers from displaying `audio` without controls. 62 | * Remove excess height in iOS 5 devices. 63 | */ 64 | 65 | audio:not([controls]) { 66 | display: none; 67 | height: 0; 68 | } 69 | 70 | /** 71 | * Address `[hidden]` styling not present in IE 8/9/10. 72 | * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. 73 | */ 74 | 75 | [hidden], 76 | template { 77 | display: none; 78 | } 79 | 80 | /* Links 81 | ========================================================================== */ 82 | 83 | /** 84 | * Remove the gray background color from active links in IE 10. 85 | */ 86 | 87 | a { 88 | background: transparent; 89 | } 90 | 91 | /** 92 | * Improve readability when focused and also mouse hovered in all browsers. 93 | */ 94 | 95 | a:active, 96 | a:hover { 97 | outline: 0; 98 | } 99 | 100 | /* Text-level semantics 101 | ========================================================================== */ 102 | 103 | /** 104 | * Address styling not present in IE 8/9/10/11, Safari, and Chrome. 105 | */ 106 | 107 | abbr[title] { 108 | border-bottom: 1px dotted; 109 | } 110 | 111 | /** 112 | * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. 113 | */ 114 | 115 | b, 116 | strong { 117 | font-weight: bold; 118 | } 119 | 120 | /** 121 | * Address styling not present in Safari and Chrome. 122 | */ 123 | 124 | dfn { 125 | font-style: italic; 126 | } 127 | 128 | /** 129 | * Address variable `h1` font-size and margin within `section` and `article` 130 | * contexts in Firefox 4+, Safari, and Chrome. 131 | */ 132 | 133 | h1 { 134 | font-size: 2em; 135 | margin: 0.67em 0; 136 | } 137 | 138 | /** 139 | * Address styling not present in IE 8/9. 140 | */ 141 | 142 | mark { 143 | background: #ff0; 144 | color: #000; 145 | } 146 | 147 | /** 148 | * Address inconsistent and variable font size in all browsers. 149 | */ 150 | 151 | small { 152 | font-size: 80%; 153 | } 154 | 155 | /** 156 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 157 | */ 158 | 159 | sub, 160 | sup { 161 | font-size: 75%; 162 | line-height: 0; 163 | position: relative; 164 | vertical-align: baseline; 165 | } 166 | 167 | sup { 168 | top: -0.5em; 169 | } 170 | 171 | sub { 172 | bottom: -0.25em; 173 | } 174 | 175 | /* Embedded content 176 | ========================================================================== */ 177 | 178 | /** 179 | * Remove border when inside `a` element in IE 8/9/10. 180 | */ 181 | 182 | img { 183 | border: 0; 184 | } 185 | 186 | /** 187 | * Correct overflow not hidden in IE 9/10/11. 188 | */ 189 | 190 | svg:not(:root) { 191 | overflow: hidden; 192 | } 193 | 194 | /* Grouping content 195 | ========================================================================== */ 196 | 197 | /** 198 | * Address margin not present in IE 8/9 and Safari. 199 | */ 200 | 201 | figure { 202 | margin: 1em 40px; 203 | } 204 | 205 | /** 206 | * Address differences between Firefox and other browsers. 207 | */ 208 | 209 | hr { 210 | -moz-box-sizing: content-box; 211 | box-sizing: content-box; 212 | height: 0; 213 | } 214 | 215 | /** 216 | * Contain overflow in all browsers. 217 | */ 218 | 219 | pre { 220 | overflow: auto; 221 | } 222 | 223 | /** 224 | * Address odd `em`-unit font size rendering in all browsers. 225 | */ 226 | 227 | code, 228 | kbd, 229 | pre, 230 | samp { 231 | font-family: monospace, monospace; 232 | font-size: 1em; 233 | } 234 | 235 | /* Forms 236 | ========================================================================== */ 237 | 238 | /** 239 | * Known limitation: by default, Chrome and Safari on OS X allow very limited 240 | * styling of `select`, unless a `border` property is set. 241 | */ 242 | 243 | /** 244 | * 1. Correct color not being inherited. 245 | * Known issue: affects color of disabled elements. 246 | * 2. Correct font properties not being inherited. 247 | * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. 248 | */ 249 | 250 | button, 251 | input, 252 | optgroup, 253 | select, 254 | textarea { 255 | color: inherit; /* 1 */ 256 | font: inherit; /* 2 */ 257 | margin: 0; /* 3 */ 258 | } 259 | 260 | /** 261 | * Address `overflow` set to `hidden` in IE 8/9/10/11. 262 | */ 263 | 264 | button { 265 | overflow: visible; 266 | } 267 | 268 | /** 269 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 270 | * All other form control elements do not inherit `text-transform` values. 271 | * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. 272 | * Correct `select` style inheritance in Firefox. 273 | */ 274 | 275 | button, 276 | select { 277 | text-transform: none; 278 | } 279 | 280 | /** 281 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 282 | * and `video` controls. 283 | * 2. Correct inability to style clickable `input` types in iOS. 284 | * 3. Improve usability and consistency of cursor style between image-type 285 | * `input` and others. 286 | */ 287 | 288 | button, 289 | html input[type="button"], /* 1 */ 290 | input[type="reset"], 291 | input[type="submit"] { 292 | -webkit-appearance: button; /* 2 */ 293 | cursor: pointer; /* 3 */ 294 | } 295 | 296 | /** 297 | * Re-set default cursor for disabled elements. 298 | */ 299 | 300 | button[disabled], 301 | html input[disabled] { 302 | cursor: default; 303 | } 304 | 305 | /** 306 | * Remove inner padding and border in Firefox 4+. 307 | */ 308 | 309 | button::-moz-focus-inner, 310 | input::-moz-focus-inner { 311 | border: 0; 312 | padding: 0; 313 | } 314 | 315 | /** 316 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in 317 | * the UA stylesheet. 318 | */ 319 | 320 | input { 321 | line-height: normal; 322 | } 323 | 324 | /** 325 | * It's recommended that you don't attempt to style these elements. 326 | * Firefox's implementation doesn't respect box-sizing, padding, or width. 327 | * 328 | * 1. Address box sizing set to `content-box` in IE 8/9/10. 329 | * 2. Remove excess padding in IE 8/9/10. 330 | */ 331 | 332 | input[type="checkbox"], 333 | input[type="radio"] { 334 | box-sizing: border-box; /* 1 */ 335 | padding: 0; /* 2 */ 336 | } 337 | 338 | /** 339 | * Fix the cursor style for Chrome's increment/decrement buttons. For certain 340 | * `font-size` values of the `input`, it causes the cursor style of the 341 | * decrement button to change from `default` to `text`. 342 | */ 343 | 344 | input[type="number"]::-webkit-inner-spin-button, 345 | input[type="number"]::-webkit-outer-spin-button { 346 | height: auto; 347 | } 348 | 349 | /** 350 | * 1. Address `appearance` set to `searchfield` in Safari and Chrome. 351 | * 2. Address `box-sizing` set to `border-box` in Safari and Chrome 352 | * (include `-moz` to future-proof). 353 | */ 354 | 355 | input[type="search"] { 356 | -webkit-appearance: textfield; /* 1 */ 357 | -moz-box-sizing: content-box; 358 | -webkit-box-sizing: content-box; /* 2 */ 359 | box-sizing: content-box; 360 | } 361 | 362 | /** 363 | * Remove inner padding and search cancel button in Safari and Chrome on OS X. 364 | * Safari (but not Chrome) clips the cancel button when the search input has 365 | * padding (and `textfield` appearance). 366 | */ 367 | 368 | input[type="search"]::-webkit-search-cancel-button, 369 | input[type="search"]::-webkit-search-decoration { 370 | -webkit-appearance: none; 371 | } 372 | 373 | /** 374 | * Define consistent border, margin, and padding. 375 | */ 376 | 377 | fieldset { 378 | border: 1px solid #c0c0c0; 379 | margin: 0 2px; 380 | padding: 0.35em 0.625em 0.75em; 381 | } 382 | 383 | /** 384 | * 1. Correct `color` not being inherited in IE 8/9/10/11. 385 | * 2. Remove padding so people aren't caught out if they zero out fieldsets. 386 | */ 387 | 388 | legend { 389 | border: 0; /* 1 */ 390 | padding: 0; /* 2 */ 391 | } 392 | 393 | /** 394 | * Remove default vertical scrollbar in IE 8/9/10/11. 395 | */ 396 | 397 | textarea { 398 | overflow: auto; 399 | } 400 | 401 | /** 402 | * Don't inherit the `font-weight` (applied by a rule above). 403 | * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. 404 | */ 405 | 406 | optgroup { 407 | font-weight: bold; 408 | } 409 | 410 | /* Tables 411 | ========================================================================== */ 412 | 413 | /** 414 | * Remove most spacing between table cells. 415 | */ 416 | 417 | table { 418 | border-collapse: collapse; 419 | border-spacing: 0; 420 | } 421 | 422 | td, 423 | th { 424 | padding: 0; 425 | } 426 | 427 | 428 | 429 | -------------------------------------------------------------------------------- /assets/css/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.1 | MIT License | git.io/normalize */ 2 | 3 | /** 4 | * 1. Set default font family to sans-serif. 5 | * 2. Prevent iOS text size adjust after orientation change, without disabling 6 | * user zoom. 7 | */ 8 | 9 | html { 10 | font-family: sans-serif; /* 1 */ 11 | -ms-text-size-adjust: 100%; /* 2 */ 12 | -webkit-text-size-adjust: 100%; /* 2 */ 13 | } 14 | 15 | /** 16 | * Remove default margin. 17 | */ 18 | 19 | body { 20 | margin: 0; 21 | } 22 | 23 | /* HTML5 display definitions 24 | ========================================================================== */ 25 | 26 | /** 27 | * Correct `block` display not defined for any HTML5 element in IE 8/9. 28 | * Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox. 29 | * Correct `block` display not defined for `main` in IE 11. 30 | */ 31 | 32 | article, 33 | aside, 34 | details, 35 | figcaption, 36 | figure, 37 | footer, 38 | header, 39 | hgroup, 40 | main, 41 | nav, 42 | section, 43 | summary { 44 | display: block; 45 | } 46 | 47 | /** 48 | * 1. Correct `inline-block` display not defined in IE 8/9. 49 | * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. 50 | */ 51 | 52 | audio, 53 | canvas, 54 | progress, 55 | video { 56 | display: inline-block; /* 1 */ 57 | vertical-align: baseline; /* 2 */ 58 | } 59 | 60 | /** 61 | * Prevent modern browsers from displaying `audio` without controls. 62 | * Remove excess height in iOS 5 devices. 63 | */ 64 | 65 | audio:not([controls]) { 66 | display: none; 67 | height: 0; 68 | } 69 | 70 | /** 71 | * Address `[hidden]` styling not present in IE 8/9/10. 72 | * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. 73 | */ 74 | 75 | [hidden], 76 | template { 77 | display: none; 78 | } 79 | 80 | /* Links 81 | ========================================================================== */ 82 | 83 | /** 84 | * Remove the gray background color from active links in IE 10. 85 | */ 86 | 87 | a { 88 | background: transparent; 89 | } 90 | 91 | /** 92 | * Improve readability when focused and also mouse hovered in all browsers. 93 | */ 94 | 95 | a:active, 96 | a:hover { 97 | outline: 0; 98 | } 99 | 100 | /* Text-level semantics 101 | ========================================================================== */ 102 | 103 | /** 104 | * Address styling not present in IE 8/9/10/11, Safari, and Chrome. 105 | */ 106 | 107 | abbr[title] { 108 | border-bottom: 1px dotted; 109 | } 110 | 111 | /** 112 | * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. 113 | */ 114 | 115 | b, 116 | strong { 117 | font-weight: bold; 118 | } 119 | 120 | /** 121 | * Address styling not present in Safari and Chrome. 122 | */ 123 | 124 | dfn { 125 | font-style: italic; 126 | } 127 | 128 | /** 129 | * Address variable `h1` font-size and margin within `section` and `article` 130 | * contexts in Firefox 4+, Safari, and Chrome. 131 | */ 132 | 133 | h1 { 134 | font-size: 2em; 135 | margin: 0.67em 0; 136 | } 137 | 138 | /** 139 | * Address styling not present in IE 8/9. 140 | */ 141 | 142 | mark { 143 | background: #ff0; 144 | color: #000; 145 | } 146 | 147 | /** 148 | * Address inconsistent and variable font size in all browsers. 149 | */ 150 | 151 | small { 152 | font-size: 80%; 153 | } 154 | 155 | /** 156 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 157 | */ 158 | 159 | sub, 160 | sup { 161 | font-size: 75%; 162 | line-height: 0; 163 | position: relative; 164 | vertical-align: baseline; 165 | } 166 | 167 | sup { 168 | top: -0.5em; 169 | } 170 | 171 | sub { 172 | bottom: -0.25em; 173 | } 174 | 175 | /* Embedded content 176 | ========================================================================== */ 177 | 178 | /** 179 | * Remove border when inside `a` element in IE 8/9/10. 180 | */ 181 | 182 | img { 183 | border: 0; 184 | } 185 | 186 | /** 187 | * Correct overflow not hidden in IE 9/10/11. 188 | */ 189 | 190 | svg:not(:root) { 191 | overflow: hidden; 192 | } 193 | 194 | /* Grouping content 195 | ========================================================================== */ 196 | 197 | /** 198 | * Address margin not present in IE 8/9 and Safari. 199 | */ 200 | 201 | figure { 202 | margin: 1em 40px; 203 | } 204 | 205 | /** 206 | * Address differences between Firefox and other browsers. 207 | */ 208 | 209 | hr { 210 | -moz-box-sizing: content-box; 211 | box-sizing: content-box; 212 | height: 0; 213 | } 214 | 215 | /** 216 | * Contain overflow in all browsers. 217 | */ 218 | 219 | pre { 220 | overflow: auto; 221 | } 222 | 223 | /** 224 | * Address odd `em`-unit font size rendering in all browsers. 225 | */ 226 | 227 | code, 228 | kbd, 229 | pre, 230 | samp { 231 | font-family: monospace, monospace; 232 | font-size: 1em; 233 | } 234 | 235 | /* Forms 236 | ========================================================================== */ 237 | 238 | /** 239 | * Known limitation: by default, Chrome and Safari on OS X allow very limited 240 | * styling of `select`, unless a `border` property is set. 241 | */ 242 | 243 | /** 244 | * 1. Correct color not being inherited. 245 | * Known issue: affects color of disabled elements. 246 | * 2. Correct font properties not being inherited. 247 | * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. 248 | */ 249 | 250 | button, 251 | input, 252 | optgroup, 253 | select, 254 | textarea { 255 | color: inherit; /* 1 */ 256 | font: inherit; /* 2 */ 257 | margin: 0; /* 3 */ 258 | } 259 | 260 | /** 261 | * Address `overflow` set to `hidden` in IE 8/9/10/11. 262 | */ 263 | 264 | button { 265 | overflow: visible; 266 | } 267 | 268 | /** 269 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 270 | * All other form control elements do not inherit `text-transform` values. 271 | * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. 272 | * Correct `select` style inheritance in Firefox. 273 | */ 274 | 275 | button, 276 | select { 277 | text-transform: none; 278 | } 279 | 280 | /** 281 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 282 | * and `video` controls. 283 | * 2. Correct inability to style clickable `input` types in iOS. 284 | * 3. Improve usability and consistency of cursor style between image-type 285 | * `input` and others. 286 | */ 287 | 288 | button, 289 | html input[type="button"], /* 1 */ 290 | input[type="reset"], 291 | input[type="submit"] { 292 | -webkit-appearance: button; /* 2 */ 293 | cursor: pointer; /* 3 */ 294 | } 295 | 296 | /** 297 | * Re-set default cursor for disabled elements. 298 | */ 299 | 300 | button[disabled], 301 | html input[disabled] { 302 | cursor: default; 303 | } 304 | 305 | /** 306 | * Remove inner padding and border in Firefox 4+. 307 | */ 308 | 309 | button::-moz-focus-inner, 310 | input::-moz-focus-inner { 311 | border: 0; 312 | padding: 0; 313 | } 314 | 315 | /** 316 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in 317 | * the UA stylesheet. 318 | */ 319 | 320 | input { 321 | line-height: normal; 322 | } 323 | 324 | /** 325 | * It's recommended that you don't attempt to style these elements. 326 | * Firefox's implementation doesn't respect box-sizing, padding, or width. 327 | * 328 | * 1. Address box sizing set to `content-box` in IE 8/9/10. 329 | * 2. Remove excess padding in IE 8/9/10. 330 | */ 331 | 332 | input[type="checkbox"], 333 | input[type="radio"] { 334 | box-sizing: border-box; /* 1 */ 335 | padding: 0; /* 2 */ 336 | } 337 | 338 | /** 339 | * Fix the cursor style for Chrome's increment/decrement buttons. For certain 340 | * `font-size` values of the `input`, it causes the cursor style of the 341 | * decrement button to change from `default` to `text`. 342 | */ 343 | 344 | input[type="number"]::-webkit-inner-spin-button, 345 | input[type="number"]::-webkit-outer-spin-button { 346 | height: auto; 347 | } 348 | 349 | /** 350 | * 1. Address `appearance` set to `searchfield` in Safari and Chrome. 351 | * 2. Address `box-sizing` set to `border-box` in Safari and Chrome 352 | * (include `-moz` to future-proof). 353 | */ 354 | 355 | input[type="search"] { 356 | -webkit-appearance: textfield; /* 1 */ 357 | -moz-box-sizing: content-box; 358 | -webkit-box-sizing: content-box; /* 2 */ 359 | box-sizing: content-box; 360 | } 361 | 362 | /** 363 | * Remove inner padding and search cancel button in Safari and Chrome on OS X. 364 | * Safari (but not Chrome) clips the cancel button when the search input has 365 | * padding (and `textfield` appearance). 366 | */ 367 | 368 | input[type="search"]::-webkit-search-cancel-button, 369 | input[type="search"]::-webkit-search-decoration { 370 | -webkit-appearance: none; 371 | } 372 | 373 | /** 374 | * Define consistent border, margin, and padding. 375 | */ 376 | 377 | fieldset { 378 | border: 1px solid #c0c0c0; 379 | margin: 0 2px; 380 | padding: 0.35em 0.625em 0.75em; 381 | } 382 | 383 | /** 384 | * 1. Correct `color` not being inherited in IE 8/9/10/11. 385 | * 2. Remove padding so people aren't caught out if they zero out fieldsets. 386 | */ 387 | 388 | legend { 389 | border: 0; /* 1 */ 390 | padding: 0; /* 2 */ 391 | } 392 | 393 | /** 394 | * Remove default vertical scrollbar in IE 8/9/10/11. 395 | */ 396 | 397 | textarea { 398 | overflow: auto; 399 | } 400 | 401 | /** 402 | * Don't inherit the `font-weight` (applied by a rule above). 403 | * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. 404 | */ 405 | 406 | optgroup { 407 | font-weight: bold; 408 | } 409 | 410 | /* Tables 411 | ========================================================================== */ 412 | 413 | /** 414 | * Remove most spacing between table cells. 415 | */ 416 | 417 | table { 418 | border-collapse: collapse; 419 | border-spacing: 0; 420 | } 421 | 422 | td, 423 | th { 424 | padding: 0; 425 | } 426 | 427 | 428 | 429 | -------------------------------------------------------------------------------- /assets/css/style.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "AAAA,SAAW,CACT,UAAU,CAAE,OAAO,CACnB,OAAO,CAAE,CAAC,CACV,MAAM,CAAE,CAAC,CACT,WAAW,CAAE,6CAA6C,CAC1D,WAAW,CAAE,MAAM,CACnB,WAAW,CAAE,IAAI,CACjB,SAAS,CAAE,IAAI,CACf,KAAK,CAAE,IAAI,6DCAb,IAAK,CACH,WAAW,CAAE,UAAU,CACvB,oBAAoB,CAAE,IAAI,CAC1B,wBAAwB,CAAE,IAAI,CAOhC,IAAK,CACH,MAAM,CAAE,CAAC,CAYX,qFAWQ,CACN,OAAO,CAAE,KAAK,CAQhB,2BAGM,CACJ,OAAO,CAAE,YAAY,CACrB,cAAc,CAAE,QAAQ,CAQ1B,qBAAsB,CACpB,OAAO,CAAE,IAAI,CACb,MAAM,CAAE,CAAC,CAQX,iBACS,CACP,OAAO,CAAE,IAAI,CAUf,CAAE,CACA,UAAU,CAAE,WAAW,CAOzB,gBACQ,CACN,OAAO,CAAE,CAAC,CAUZ,WAAY,CACV,aAAa,CAAE,UAAU,CAO3B,QACO,CACL,WAAW,CAAE,IAAI,CAOnB,GAAI,CACF,UAAU,CAAE,MAAM,CAQpB,EAAG,CACD,SAAS,CAAE,GAAG,CACd,MAAM,CAAE,QAAQ,CAOlB,IAAK,CACH,UAAU,CAAE,IAAI,CAChB,KAAK,CAAE,IAAI,CAOb,KAAM,CACJ,SAAS,CAAE,GAAG,CAOhB,OACI,CACF,SAAS,CAAE,GAAG,CACd,WAAW,CAAE,CAAC,CACd,QAAQ,CAAE,QAAQ,CAClB,cAAc,CAAE,QAAQ,CAG1B,GAAI,CACF,GAAG,CAAE,MAAM,CAGb,GAAI,CACF,MAAM,CAAE,OAAO,CAUjB,GAAI,CACF,MAAM,CAAE,CAAC,CAOX,cAAe,CACb,QAAQ,CAAE,MAAM,CAUlB,MAAO,CACL,MAAM,CAAE,QAAQ,CAOlB,EAAG,CACD,eAAe,CAAE,WAAW,CAC5B,UAAU,CAAE,WAAW,CACvB,MAAM,CAAE,CAAC,CAOX,GAAI,CACF,QAAQ,CAAE,IAAI,CAOhB,iBAGK,CACH,WAAW,CAAE,oBAAoB,CACjC,SAAS,CAAE,GAAG,CAkBhB,qCAIS,CACP,KAAK,CAAE,OAAO,CACd,IAAI,CAAE,OAAO,CACb,MAAM,CAAE,CAAC,CAOX,MAAO,CACL,QAAQ,CAAE,OAAO,CAUnB,aACO,CACL,cAAc,CAAE,IAAI,CAWtB,yEAGqB,CACnB,kBAAkB,CAAE,MAAM,CAC1B,MAAM,CAAE,OAAO,CAOjB,qCACqB,CACnB,MAAM,CAAE,OAAO,CAOjB,gDACwB,CACtB,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CAQZ,KAAM,CACJ,WAAW,CAAE,MAAM,CAWrB,0CACoB,CAClB,UAAU,CAAE,UAAU,CACtB,OAAO,CAAE,CAAC,CASZ,+FACgD,CAC9C,MAAM,CAAE,IAAI,CASd,oBAAqB,CACnB,kBAAkB,CAAE,SAAS,CAC7B,eAAe,CAAE,WAAW,CAC5B,kBAAkB,CAAE,WAAW,CAC/B,UAAU,CAAE,WAAW,CASzB,kGACgD,CAC9C,kBAAkB,CAAE,IAAI,CAO1B,QAAS,CACP,MAAM,CAAE,iBAAiB,CACzB,MAAM,CAAE,KAAK,CACb,OAAO,CAAE,qBAAqB,CAQhC,MAAO,CACL,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CAOZ,QAAS,CACP,QAAQ,CAAE,IAAI,CAQhB,QAAS,CACP,WAAW,CAAE,IAAI,CAUnB,KAAM,CACJ,eAAe,CAAE,QAAQ,CACzB,cAAc,CAAE,CAAC,CAGnB,KACG,CACD,OAAO,CAAE,CAAC,CCvaZ,OAAQ,CACN,UAAU,CAAE,MAAM,CAClB,OAAO,CAAE,OAAO,CAEhB,cAAO,CACL,aAAa,CAAE,IAAI,CACnB,OAAO,CAAE,MAAM,CACf,iBAAG,CACD,WAAW,CAAE,MAAM,CACnB,aAAa,CAAE,IAAI,CACnB,gDAAkB,CAChB,OAAO,CAAE,YAAY,CACrB,KAAK,CAAE,OAAO,CACd,OAAO,CAAE,MAAM,CACf,SAAS,CAAE,IAAI,CAGnB,gBAAE,CACA,KAAK,CAAE,OAAO,CACd,SAAS,CAAE,KAAK,CAChB,UAAU,CAAE,IAAI,CAGpB,eAAQ,CACN,KAAK,CAAE,IAAI,CACX,SAAS,CAAE,KAAK,CAChB,MAAM,CAAE,MAAM,CAIlB,IAAK,CACH,MAAM,CAAE,cAAc,CACtB,KAAK,CAAE,IAAI,CACX,OAAO,CAAE,YAAY,CACrB,OAAO,CAAE,mBAAmB,CAC5B,eAAe,CAAE,IAAI,CACrB,QAAQ,CAAE,QAAQ,CAClB,UAAU,CAAE,OAAO,CACnB,MAAM,CAAE,MAAM,CAEd,WAAS,CACP,OAAO,CAAE,EAAE,CACX,OAAO,CAAE,YAAY,CACrB,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,GAAG,CACR,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,YAAY,CAAE,IAAI,CAClB,UAAU,CAAE,wCAAwC,CACpD,eAAe,CAAE,SAAS,CAE5B,wBAAsB,CACpB,mBAAmB,CAAE,OAAO,CAE9B,UAAQ,CACN,OAAO,CAAE,EAAE,CACX,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,EAAE,CACX,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,MAAM,CAAE,cAAc,CACtB,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CAIf,cAAe,CACb,UAAU,CAAE,MAAM,CAClB,WAAW,CAAE,KAAK,CAGpB,oBAAqB,CACnB,OAAO,CAAE,YAAY,CACrB,MAAM,CAAE,QAAQ,CAChB,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CC3Ef,KAAM,CACJ,QAAQ,CAAE,QAAQ,CCMlB,OAAO,CAAE,IAAI,CACb,OAAO,CAAE,YAAY,CACrB,YAAY,CAAE,IAAI,CAIlB,SAAS,CDVW,QAAQ,CCW5B,eAAe,CDXe,MAAM,CCYpC,aAAa,CDZyB,MAAM,CCa5C,WAAW,CDbmC,MAAM,CCepD,iBAAiB,CDfG,QAAQ,CCgB5B,uBAAuB,CDhBO,MAAM,CCiBpC,qBAAqB,CDjBiB,MAAM,CCkB5C,mBAAmB,CDlB2B,MAAM,CCoBpD,cAAc,CDpBM,QAAQ,CCqB5B,oBAAoB,CDrBU,MAAM,CCsBpC,kBAAkB,CDtBoB,MAAM,CCuB5C,gBAAgB,CDvB8B,MAAM,CACpD,UAAU,CAAE,KAAK,CACjB,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,OAAO,CAAE,CAAC,CAEV,cAAS,CACP,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,EAAE,CACX,UAAU,CAAE,MAAM,CAClB,aAAa,CAAE,KAAK,CAGtB,QAAG,CACD,SAAS,CAAE,IAAI,CACf,MAAM,CAAE,CAAC,CAET,YAAI,CACF,KAAK,CAAE,GAAG,CACV,SAAS,CAAE,KAAK,CAIpB,OAAE,CACA,SAAS,CAAE,KAAK,CAChB,aAAa,CAAE,IAAI,CAGrB,WAAQ,CACN,OAAO,CAAE,EAAE,CACX,OAAO,CAAE,KAAK,CACd,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,GAAG,CACX,UAAU,CAAE,sCAAsC,CAClD,QAAQ,CAAE,QAAQ,CAClB,MAAM,CAAE,KAAK,CACb,IAAI,CAAE,CAAC,CAET,sBAAiB,CACf,MAAM,CAAE,cAAc,CACtB,UAAU,CAAE,MAAM,CAClB,KAAK,CAAE,KAAK,CACZ,UAAU,CAAE,OAAO,CAEnB,2CAAqB,CACnB,aAAa,CAAE,cAAc,CAC7B,cAAc,CAAE,SAAS,CACzB,OAAO,CAAE,KAAK,CACd,SAAS,CAAE,IAAI,CAEjB,2CAAqB,CACnB,SAAS,CAAE,KAAK,CAChB,OAAO,CAAE,SAAS,CAKxB,aAAc,CACZ,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,CAAC,CACR,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CElEZ,SAAU,CACR,UAAU,CAAE,MAAM,CAClB,cAAc,CAAE,IAAI,CAEpB,kBAAS,CACP,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CACb,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,MAAM,CACf,UAAU,CAAE,UAAU,CACtB,qBAAG,CACD,WAAW,CAAE,MAAM,CAErB,oBAAE,CACA,KAAK,CAAE,OAAO,CAIlB,eAAQ,CACN,OAAO,CAAE,EAAE,CACX,KAAK,CAAE,IAAI,CACX,OAAO,CAAE,KAAK,CACd,MAAM,CAAE,CAAC,CACT,KAAK,CAAE,CAAC,CCxBZ,SAAU,CACR,WAAW,CAAE,GAAG,CAEd,uBAAK,CACH,OAAO,CAAE,KAAK,CACd,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,OAAO,CAAE,CAAC,CACV,QAAQ,CAAE,QAAQ,CAClB,UAAU,CAAE,uCAAuC,CACnD,eAAe,CAAE,SAAS,CAC1B,MAAM,CAAE,IAAI,CACZ,GAAG,CAAE,GAAG,CACR,UAAU,CAAE,KAAK,CACjB,QAAQ,CAAE,MAAM,CAChB,WAAW,CAAE,OAAO,CAEtB,4BAAU,CACR,KAAK,CAAE,IAAI,CACX,YAAY,CAAE,IAAI,CAEpB,4BAAU,CACR,IAAI,CAAE,IAAI,CACV,WAAW,CAAE,IAAI,CACjB,mBAAmB,CAAE,KAAK,CAIhC,eAAgB,CACd,UAAU,CAAE,IAAI,CAChB,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CACb,aAAa,CAAE,MAAM,CACrB,QAAQ,CAAE,QAAQ,CAElB,sBAAS,CACP,OAAO,CAAE,EAAE,CACX,UAAU,CAAE,IAAI,CAChB,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,EAAE,CACP,MAAM,CAAE,EAAE,CACV,IAAI,CAAE,GAAG,CACT,KAAK,CAAE,GAAG,CACV,aAAa,CAAE,MAAM,CAIzB,QAAS,CACP,OAAO,CAAE,UAAU,CACnB,KAAK,CAAE,OAAO,CACd,QAAQ,CAAE,QAAQ,CAClB,cAAM,CACJ,OAAO,CAAE,YAAY,CACrB,MAAM,CAAE,QAAQ,CAChB,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CACb,QAAQ,CAAE,MAAM,CAChB,sCAAwB,CACtB,IAAI,CAAE,IAAI,CACV,GAAG,CAAE,KAAK,CACV,KAAK,CAAE,IAAI,CACX,UAAU,CAAE,IAAI,CAChB,WAAW,CAAE,IAAI,CACjB,SAAS,CAAE,IAAI,CACf,KAAK,CAAE,OAAO,CACd,WAAW,CAAE,IAAI,CAEjB,2DAAqB,CACnB,SAAS,CAAE,IAAI,CACf,WAAW,CAAE,MAAM,CAGvB,mEAAuC,CACrC,GAAG,CAAE,IAAI,CACT,SAAS,CAAE,IAAI,CACf,MAAM,CAAE,IAAI,CAEd,2EAA+C,CAC7C,KAAK,CAAE,OAAO,CACd,SAAS,CAAE,IAAI,CACf,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,KAAK,CACV,KAAK,CAAE,IAAI,CAEb,uCAAyB,CACvB,GAAG,CAAE,GAAG,CACR,SAAS,CAAE,IAAI,CACf,UAAU,CAAE,KAAK,CAEnB,2EAA+C,CAC7C,QAAQ,CAAE,QAAQ,CAClB,IAAI,CAAE,IAAI,CACV,MAAM,CAAE,GAAG,CACX,MAAM,CAAE,IAAI,CACZ,UAAU,CAAE,OAAO,CACnB,KAAK,CAAE,IAAI,CACX,cAAc,CAAE,SAAS,CACzB,WAAW,CAAE,IAAI,CACjB,WAAW,CAAE,IAAI,CACjB,KAAK,CAAE,KAAK,CACZ,OAAO,CAAE,MAAM,CACf,SAAS,CAAE,IAAI,CACf,iLAAkB,CAAE,OAAO,CAAE,IAAI,CAGrC,eAAO,CACL,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,IAAI,CACT,IAAI,CAAE,IAAI,CACV,SAAS,CAAE,IAAI,CACf,WAAW,CAAE,IAAI,CACjB,UAAU,CAAE,IAAI,CAChB,sBAAO,CACL,OAAO,CAAE,KAAK,CACd,SAAS,CAAE,IAAI,CACf,WAAW,CAAE,MAAM,CAGvB,sBAAc,CACZ,QAAQ,CAAE,QAAQ,CAClB,MAAM,CAAE,IAAI,CACZ,IAAI,CAAE,IAAI,CACV,QAAQ,CAAE,MAAM,CAChB,SAAS,CAAE,IAAI,CAEf,2BAAK,CACH,MAAM,CAAE,iBAAiB,CACzB,OAAO,CAAE,KAAK,CACd,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,QAAQ,CAAE,QAAQ,CAClB,kCAAS,CACP,OAAO,CAAE,EAAE,CACX,OAAO,CAAE,KAAK,CACd,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,GAAG,CACR,IAAI,CAAE,GAAG,CACT,MAAM,CAAE,aAAa,CACrB,UAAU,CAAE,wCAAwC,CACpD,mBAAmB,CAAE,OAAO,CAC5B,eAAe,CAAE,SAAS,CAE5B,kCAAS,CACP,KAAK,CAAE,IAAI,CACX,WAAW,CAAE,IAAI,CACjB,aAAa,CAAE,IAAI,CACnB,UAAU,CAAE,IAAI,CAChB,yCAAS,CAAE,mBAAmB,CAAE,OAAO,CAEzC,2CAAkB,CAAE,mBAAmB,CAAE,OAAO,CAChD,oCAAW,CACT,WAAW,CAAE,IAAI,CACjB,YAAY,CAAE,IAAI,CAClB,2CAAS,CAAE,mBAAmB,CAAE,OAAO,CC5J/C,aAAc,CACZ,UAAU,CAAE,IAAI,CAChB,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CACb,aAAa,CAAE,MAAM,CACrB,QAAQ,CAAE,QAAQ,CAClB,WAAW,CAAE,IAAI,CAEjB,oBAAS,CACP,OAAO,CAAE,EAAE,CACX,UAAU,CAAE,IAAI,CAChB,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,EAAE,CACP,MAAM,CAAE,EAAE,CACV,IAAI,CAAE,GAAG,CACT,KAAK,CAAE,GAAG,CACV,aAAa,CAAE,MAAM,CAEvB,0BAAa,CACX,OAAO,CAAE,YAAY,CACrB,cAAc,CAAE,MAAM,CACtB,MAAM,CAAE,MAAM,CACd,QAAQ,CAAE,QAAQ,CAEpB,mBAAM,CACJ,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CACb,QAAQ,CAAE,MAAM,CAElB,oBAAO,CACL,QAAQ,CAAE,QAAQ,CAClB,KAAK,CAAE,IAAI,CACX,YAAY,CAAE,IAAI,CAClB,KAAK,CAAE,OAAO,CACd,SAAS,CAAE,IAAI,CACf,UAAU,CAAE,KAAK,CACjB,WAAW,CAAE,IAAI,CACjB,0BAAQ,CACN,OAAO,CAAE,KAAK,CACd,OAAO,CAAE,KAAK,CACd,SAAS,CAAE,IAAI,CAGnB,qCAAwB,CACtB,KAAK,CAAE,OAAO,CACd,WAAW,CAAE,IAAI,CACjB,0DAAqB,CAAE,WAAW,CAAE,MAAM,CAG1C,sDAAwB,CACtB,GAAG,CAAE,IAAI,CACT,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,GAAG,CACX,YAAY,CAAE,IAAI,CAIpB,sDAAwB,CACtB,GAAG,CAAE,IAAI,CACT,KAAK,CAAE,IAAI,CACX,IAAI,CAAE,IAAI,CACV,MAAM,CAAE,GAAG,CACX,WAAW,CAAE,IAAI,CACjB,UAAU,CAAE,IAAI,CAElB,qCAAO,CACL,KAAK,CAAE,IAAI,CACX,IAAI,CAAE,IAAI,CACV,UAAU,CAAE,IAAI,CAChB,YAAY,CAAE,CAAC,CACf,WAAW,CAAE,IAAI,CCtEvB,OAAQ,CACN,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,CAAC,CACV,UAAU,CAAE,MAAM,CAClB,cAAc,CAAE,IAAI,CAEpB,gBAAS,CACP,OAAO,CAAE,MAAM,CACf,qBAAK,CAAC,UAAU,CAAE,OAAO,CAG3B,SAAE,CACA,SAAS,CAAE,KAAK,CAChB,WAAE,CACA,KAAK,CAAE,OAAO,CAEhB,aAAI,CACF,OAAO,CAAE,MAAM,CCjBrB,yBAA0B,CAEtB,eAAQ,CACN,SAAS,CAAE,KAAK,EAKtB,yBAA0B,CACxB,eAAgB,CACd,KAAK,CAAE,KAAK,CAEd,QAAS,CACP,MAAM,CAAE,KAAK,CACb,cAAM,CACJ,KAAK,CAAE,KAAK,CAGhB,2EACwC,CACtC,IAAI,CAAE,GAAG,CACT,MAAM,CAAE,IAAI,CACZ,GAAG,CAAE,GAAG,CACR,WAAW,CAAE,KAAK,CAClB,UAAU,CAAE,KAAK,CAEnB,2EACwC,CACtC,GAAG,CAAE,GAAG,CACR,UAAU,CAAE,KAAK,EAIrB,yBAA0B,CAEtB,gDAAkB,CAAE,OAAO,CAAE,IAAI,CAEnC,eAAgB,CACd,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CAEf,QAAS,CACP,WAAW,CAAE,KAAK,CAEpB,cAAe,CAAE,KAAK,CAAE,IAAI,CAC5B,sBAAuB,CACrB,OAAO,CAAE,IAAI,CAEf,sCAAuC,CACrC,IAAI,CAAE,IAAI,CACV,KAAK,CAAE,CAAC,CACR,WAAW,CAAE,CAAC,CACd,KAAK,CAAE,IAAI,CACX,GAAG,CAAE,KAAK,CACV,OAAO,CAAE,CAAC,CACV,UAAU,CAAE,KAAK,EAIrB,yBAA0B,CAEtB,eAAQ,CACN,SAAS,CAAE,KAAK,CAIlB,wBAAS,CACP,QAAQ,CAAE,QAAQ,CAClB,KAAK,CAAE,GAAG,CACV,MAAM,CAAE,MAAM,CACd,WAAW,CAAE,IAAI,CACjB,QAAQ,CAAE,MAAM,CAChB,6BAAK,CACH,GAAG,CAAE,CAAC,CACN,MAAM,CAAE,CAAC,CACT,QAAQ,CAAE,QAAQ,CAClB,IAAI,CAAE,IAAI,CACV,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,sCAAW,CAAE,KAAK,CAAE,IAAI,CACxB,sCAAW,CAAE,KAAK,CAAE,KAAK,EAKjC,yBAA0B,CACxB,cAAe,CACb,aAAa,CAAE,CAAC,CAChB,OAAO,CAAE,MAAM,CAEjB,6BAA8B,CAC5B,OAAO,CAAE,eAAe,CAE1B,OAAQ,CAAE,OAAO,CAAE,MAAM,CACzB,SAAU,CAAE,OAAO,CAAE,MAAM,CAAE,WAAW,CAAE,IAAI,CAC9C,gBAAiB,CAAE,OAAO,CAAE,UAAU,CACtC,uBAAyB,CACvB,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,QAAQ,CAChB,UAAU,CAAE,UAAU,CAExB,WAAY,CAAE,OAAO,CAAE,GAAG,CAExB,iBAAG,CAAE,SAAS,CAAE,KAAK,CACrB,gBAAE,CAAE,SAAS,CAAE,GAAG", 4 | "sources": ["style.scss","_normalize.scss","_base.scss","_hero.scss","_vars.scss","_features.scss","_examples.scss","_versus.scss","_footer.scss","_responsive.scss"], 5 | "names": [], 6 | "file": "style.css" 7 | } -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Blockrain.js - A Tetris game in HTML5 + Javascript (with autoplay!) 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 48 | 49 | 50 | 51 | 52 |
53 | 54 |
55 |

56 |

Embed & play the classic game on your site. Simple as that.

57 | 58 |
59 | Download 60 | Fork on Github 61 |
62 |
63 | 64 |
65 | 66 |
67 | 68 |
69 |
70 |

More than just a game

71 |

Apart from being able to play it, you can customize it!

72 |
73 |
74 |
75 | 76 |
77 |

Plug 'n' Play

78 |

Just copy and paste a bit of code and you'll be good to go

79 |
80 |
81 | 82 |
83 | 84 |
85 |

Responsive

86 |

No matter how wide or narrow your display is, you'll always be able to play.

87 |
88 |
89 | 90 |
91 | 92 |
93 |

Design

94 |

Customize it as you want. Change the colors to fit your site.

95 |
96 |
97 | 98 |
99 | 100 |
101 |

Speed

102 |

Adjust how fast the blocks are falling to make it more difficult.

103 |
104 |
105 | 106 |
107 | 108 |
109 |

Score

110 |

Add the scoreboard or not. That's your decision.

111 |
112 |
113 | 114 |
115 | 116 |
117 |

Autoplay

118 |

Let the bots battle against each other. Just for the lulz.

119 |
120 |
121 |
122 |
123 | 124 | 125 | 126 |
127 |
128 |

Let the bots play against each other

129 |
130 | 131 |
132 |
133 |
0
134 |
135 |
136 | 137 |
138 |
0
139 |
140 |
141 |
142 | 143 |
144 | 145 | 146 | 147 |
148 |
149 |

Try it yourself!

150 |
151 |
152 |
153 |
theme: "vim"
154 |
155 | Use only arrows 156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 | Previous 167 | Next 168 |
169 |
170 | 171 |
172 | 173 | 174 | 183 | 184 | 185 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 279 | 280 | 281 | 282 | -------------------------------------------------------------------------------- /src/blockrain.jquery.themes.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Themes. You can add more custom themes to this object. 3 | */ 4 | window.BlockrainThemes = { 5 | 'custom': { 6 | background: '#040304', 7 | backgroundGrid: 'data:image/png;base64,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', 8 | complexBlocks: { 9 | line: ['assets/blocks/custom/line.png', 'assets/blocks/custom/line.png'], 10 | square: ['assets/blocks/custom/square.png'], 11 | arrow: 'assets/blocks/custom/arrow.png', 12 | rightHook:['assets/blocks/custom/rightHook.png'], 13 | leftHook: 'assets/blocks/custom/leftHook.png', 14 | rightZag: ['assets/blocks/custom/rightZag.png'], 15 | leftZag: 'assets/blocks/custom/leftZag.png' 16 | } 17 | }, 18 | 'candy': { 19 | background: '#040304', 20 | backgroundGrid: 'data:image/png;base64,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', 21 | blocks: { 22 | line: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACuklEQVR4Xi2MzW4cRRSFz/2p6p4eT2zjjE2MHBQWvAALNjwDS8SOFc/FIyCxQgh2LFHkBQgJyQo/wXKCEZ7x9E9VV93LBPNJ516dxXfo/U8+HTZ9uzrZympTjLo4DbtDiBpXSBGMocI5lkaMhKv0fz+LVX9P6ZuvvxqBby+3L3eJu6Zt27DL4qgIWW0KsxPC3Kjxz5fPT3z48csvtHSHd0C/1374RddPX/9xK6JdcjEutNfqFJMBsQat3By+i/7VxqJ6c/zd5avvn1+N7dl2V9Ad92M2ViI2ksyWSJ2QXQXc5/H25jYcHHKl1YYebcJqw/rW03OOzfr89NHbR8vH3Wq9Olofrddni+XhycXJhBSkKFLxWeHBZFFDVyD343Rzc/0XeYSXeXZIJaam2V9pLsBOtRIKYAorXqvAg8giaKsCKw1zJAGFbKhwtxrdG9E3BQxAIW1xyYUKUIwNxMAwDEwuSgA5iAw2l5ITOeE/GLRMihIOsnQZnKqOlWXRUWidyYkFpCxtCF1s8D+seBggYVYRhChkqqjmld3NKhhu1XKuKUf4g6egEitkvqc5ewo+3ZOVZJO4Q4OSEDGRRyAQkYH8QfMUCR07KS8DIsO8xhjcnUXnSv4GMRYShSUG2MFCeby/awOJFyvF3TU22ckk3E3FQjci+mJVggwz12rKVEvWOk3dwWpIr7ezrU4XZ+9ciBAxWCVlhDb2o5cZTgBR17R3w45hgg8/fu+Dj643adZVXzCmebsbp5T6fhr2L9W8z5xLNsyDpl2btrsXPynS9NvVVc28xzMLPDCUYbVUMy+TMgdinupCEapdvPv0lqGwjW9fHsXjF39eIzRpnFbLdiy918qCWmclnq3mcWhVnzw5v+83XYz0+LPP/8lL704NB3BBdbCDKlChAq8QgRvmGSFouyo3vz7Lr/8FMHqie3VCpNQAAAAASUVORK5CYII=', 23 | square: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACfUlEQVR4Xh3LvY5cRRBA4VNV3ffe+fEaZARgWfBExEhEZEg8A69AgkC8AzEiICMgJCdAxggsGRuW3Z3dmenbXVWskT6d7MiXnz3qclu87esm1qW3NteRuqaCIAmQABwPvPU2NyeaUa6P159/9QV3l/HqlWqN41El0PaadEJAoZBKqS9+eybL/tvvvi8PrHA4ku33pz9v5rafKmc0I7QhbiGaJSikyeCh1T7OG6fMluOvP/5+8csb+/RxhUtlEXA5KUMpiEpWwZKU3D799Zl1CtpEjsoh++HRxUMBVhgry4yUXLvstnE8qWi/HZndTEwpppj5XLIg7fZ4+fJlb91jzSlGhjc2O7RMj995nApRIRW0BHRl9UXLona6PYiGGKpaa50qPtQ96/5BCgkpBKghpI7VJZK5bmYju5IxQkZONqtbu+txd5ZEQFI0KaRRJxEZY0wjh/dqKqbZ/z9tqmJIqpQSnaD8T9sYkGqWmuTIZHgoWYupKh4SqSQimqrJfeV1gTECF4NKmUHwDFRqNSuJjMTxFQANNKGUyTBxYqSX6J6USdc1BquYFhEMFEQCUvSeC5rheL/Y74kAvX/OPXRZojIkqHkaLpMwWdYJm1fHlZIJotdXN7tFtczvvfuB5MIyRZwQ11pora2BTKOvva3zPKtStpsKLNNmmcr53xtFMtLaGLSR61IKKaPHenO1L2+qThqrn5FvPuGjjz8s4x+NI6Ptdvtxckywo0cjstZZZfZhNhSWNuoPP/5Udhebc8+tbp4//zPd6dcaGtJtWtUiVkhTWSJkTn3y5P15M19ervL1p9UZFzX9zHYmO1Ph3KFQK+rkIBMScbY7DicOzn+QRoW5iamqhgAAAABJRU5ErkJggg==', 24 | arrow: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACsklEQVR4XhWPu25bVxREZz/OuQ9RVKhXjBSu8gX5h+QD0udD8ilByjRpUqZxa6RxY8DuYlhwHhAc2qRIieK9vOfsvUMNBoPVrGLoh6+++7y7mbFfTNIVdShCxCGuAgE8tSilhOVWU6lrtPjPK33ffvvb6xd4KG9/+f1kenIYoAgOIc+AF9u5Rdteuvubty9LU168fqW9z7AFanr36uPZSOIgWHB1IJABKE0keSr3QdLolXitjw1n717++sfPP/7Ula6pfbYmeU7eaBybnzg6ewwpT8DW/vth2acFkzf9Pi0OOU1+/eVlM2/m14vZ+Rfz88t+Np+fnZ8tns1OL66vLss0FIughgppDumLzIpmYBrHz+uVsZVSsraorJoMQU5dOs3K3jaiSXGciNYoG3cQcbJjwiKC3Ny9ljhEEUlGBnh4IJwR+qQ6q7FbuMPBLEQCVjaYA0mYwcyIY6p5qYFQQqOexRMhHOqg6sV8mtiqQki51gSHV6YAMYMMxgIC2IOcBcIsQipBBCIjNqEQBWARjjAOHAtSh1eqk9bqLpBKQUSZE4ccIqpJFnWQiRSKypjUA1DgEDw5janNkgA4zKmGQtpgsNqhMoRCmRni4AgKJh6DB842TffENWWqU+m448eYje186GZT31nXo5EqPhUGIqoGwd1gtWFtRBeLxcXF1TydYh+td1E5lMdpOOxGr9bPOzdrtFGWk2lAg84e9/fYbGmsync0xD7mfkITgUMbJaKc26GOVn2sB61Gf958OE992wsoQjSSjBHUwEmlISTsxjEsOIsxP3v+/M3tey3wrRVh29wuA2Vo3Xoe3KP6Endhzh3v92NjKefcXZzETKxR+Sa+vt2s3/3z127YrYfN+mGz2m4+rT+tNuu77d3yfvn3+vbh8eH4bb3dLrer97c3q7L6H15gvODKB5u4AAAAAElFTkSuQmCC', 25 | rightHook:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACqElEQVR4Xh3PO2tlZRSH8f9a73XvPTkTExl1dLAIKFpNY2Fl4UcT7G3FwmIaO3sbEfQjWAxDAkIORDHJyXFf3stayzC/9qke+ubrF0u7zqwfsJNFXEKtCAJriBGBoB0gNAZ5WIekcC0f+br8++3Pr1AP5Y/f6Xgfx4RqoB2kI27QgkYQw5BA2L95M+vTn379y0c2HI+Y5Ob6z3B/M/ZmlTieV7ISj9rXZ2n338NciEMedGshJacbZ9X16vK3H76vh/1paCOWiWvos5M1U9llLIebKeqz0zG4PmZ/dfl6XWc/9p4Ox/fMwnIcXrwL6ohPg54OZhYTUUc+w1YQ83z3kMadEKdp8EmE54cnKifTBLOr17cqtwIf4gAuKhUd8Lh4+TKPowjyOK1l8cxAm9nK2nWnsQeAyNtgldnClCLntkrRrTBcFyPjYRg8AEAY4JDhkhp7uOBIRbyqrmK+KcBm1qU30UbSxHcGnIGpKYk63dQxnC2sPcWo2slZUCCGYXPkkBnUqjcCSAGFsaOUQk5koqUqPFV5G2sDai+tG3vv6ZF3BojBzFrvpeij4KtDZTjPXTWGBA91uWJTo1WkqTAZoAbpT3ejd0YOBW1zoAHE/tG8FThm52KOLnDv1dA8DACTwbRU6TxSaX1WZII/1qBgwLvWtgN6ieQc2hC9hwLGTFS35eTJ7uOL5xxTkZI44l7BDGpwBke8FFCA9Pj2EAipHbd8Qre3fxOMDWykGryyM2Vv67JwmCJ7cQRRM6JXX+CrLz97/uHJ4bgHFUdKBi8B5gECLLAys4grAkr5Vt758ZdLTwhuPNvfHP7ZPzjrBAHYLBlChwPQ+jrtpq2UJv3i0/clni/Y03efYzxPvZdBkAzeAKATukENAoTA86ynZ3GrVQl3Eu/yJ/8D33mmeKR3Cz8AAAAASUVORK5CYII=', 26 | leftHook: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACq0lEQVR4Xg3HO24mVRBH8X/Vrfv4ut02BjS8GSBAQuyCmE0gwSLICFgCBLASAhLiiQjQICFBMAMSFn63v+77qCp89EsO5U+/rus/0zQPPW8thXRQABLAjtHAAZ2gzGk2HRCG1YMPwgdf/fnXj1fX+O7732s/A0kzbwEUCW5Fgh8HGVdFTOn5H79NiZ/98rPATBVS8OzX5xTehYsxd3KFwXcGEljVOGVJ8a7W4Q4YT8sb33z70xdf/oB8HufzhjI0m2a3JLykuAyV4RGxrLVN5+f/3dxSKXJc59qfUk77djhdXhGx0/mMAg/rpm30bXq97Fp3su1mrMe19e46BLLw9Nb1w0WaZoO+fPmCNbTW3D1Fcjci77Cnn3wMhCBpWU7vuwqo3evgaar6QHRqfRXKhQiELFG1O6H3MZUyLpTIx24UMkNASbqZwZiN3AQsgKhZ6/VYR9OcDw/blg5xmKqPnIRBLQUZw4iIWQKydRcEcvLOOZ2A80Nv8SRv1iiHQWPXewbztm3MbObMYgpGCMwiwgwAIhJCAGBmjMD+KDJJThJzTI8TKZm5E9S7U3c0s6PrkVujvYbm0Qr1iceJ+GZ9772OMawNDNAgVm8cADcAQSgzCSiChZj8MRLwXCTPufQEC8SlVKPWNTJJ4BTDcds58tCaMsVoIQ8Nq2AgS97uVg2h7v29Dz86W86MGqB922F+djjsdbWE0eu233fbwF0opd57KYU43l5ewQ43N7d17CwUHJnlsl4QmUwkJJKZ5uXaLdBrnzl6EGbTbV2nVIiMuMU44EMwMjn76GMHeWAKhKuLvyXoC+F3IvXrfy9zmO/WKyUM6c1riWUY7btKiA+9UkyvPnk7KFMPtLz/uS9vrjVFLNqTUSEJNLN5hQL7gIXpsGytO0ekCduR/fg/hV+olVqSm3YAAAAASUVORK5CYII=', 27 | rightZag: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACt0lEQVR4Xg3LOW6eVRQG4PcM937DP9hYlkgUQ6RQsAiEWAC7YCWUtGyAFqhpEHRI0CCBIjpHJBSxEhzkxP6H+93pHPz0D3358IsbuyY/XlCs7/YU5zjFZgdGp07BEDq4KXwA0PvuqIfDGbT0u69/+hZvr/DrH1gc1WENwUAGM3RDcXQGRbA9/e3nJPX3F5dqdY/ja8ztx++/+YhX5S6P47REODW2Pra+qsbOR5VFWwjHVPKJJF1FevPn019++O7jeYo3h5VG8Ua5OLnCh25T7+RwYfZavVz993q5OehccfImnV3nqdLjD54gTiDAF3cnEJrBAbZNSS//vTKP1FcTk0ppsfYzkpEt58Pls8vb29vTabDWYZJzjsqnJ+vHjx9tVvf3qG3QVpXJ0Y5L2xWmYbPt7W5WeK7RKUqICic7poQY6q4Fw2AUDSykUGUlQ0cUy3XUqCxm8Obe4SypVoRwOC7kLE5szIoBHsmlO6NJO3Qv5GEozI3IiE25K2EeLAiYADiBOwi51NLdCRrGcQ5xTLVUcg1BVeFszXtaWinkIAcALigQDwISby0Vq3dpR8IA2r1cKNfZRTq9F2c1iLuYqQcHg2Dmvbam08QUG1V07zASqDCLouSSE0tojCbGablFoMgkpMxht9QukvICASIXtNLy7rDDakVDeGepzpIUup1mlIZs5Dbo9OknnwEELGgZJgBhHHDYIx/v8/r98+d/P2cVVSOkitRPN9uXfz0j2rRSh1CZDKRmFomgnns62Wyvrq+ncTy2JJ/rRXv76vx04ymr83pci9gYRYISS4N3cgRKvYb15EHOHzy8fPaPgtMe8zHG5y8uH6y3wa7LPbNOIIkQRpCOZt7KzatHFx+Ww0Ki9NX8ZHWy7Sltchtz2aj32nicjZkpLr1m760vp5tN2e8jtHX0Yf4f3da+1L4oEEQAAAAASUVORK5CYII=', 28 | leftZag: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACtElEQVR4Xg2Lu25cZRhF93f5L3OOPeOQmJuDhEIHDa/CC/B4SHSICqS0CERDE2MJAYKEmITEcewZz/nvH7O0taq16eTL++P66nhCDegOAEhghFYhDDM0hSgowQkKkDIwJi0pP/72G9j24vIi8S7nN34lYG1VyOKg0uVKFFIiY/XL+R8s977+6nvttBMkovTDz9/Np3G3fTlvYkoFJswzaxtya2haQ0nUdGa2PLY6GD/9+vjJ+Y+bD+K2vFxtrLS3cQq9t1rLwUZ7IpuOAmQQ8u9/PgFDWbG5708/jK/Ti9OzExErhYVU1TMrCZqV7fY2Or2+uQ5H7zgPMNQF5HL7+upZeFeHLU//etrraM2YedQBAXsnoPXHn8yrcHVzE0LICWoECTQf+SG19dRqK3tMUxSRZtkIZtqbsblW+vF8/Pzy1XoNvdthjDas7He7swdno+JkM21v997r6A1MIKNBwiCiXssqhNsbcAwQosPTeek1MzBa947NmnewYcGR8Oh1sZG8s5LvQoACaK0Yegi+965MNWXnxIAx0AdyWnqDMjuh1KoIkYGNUPqh0zHaYcpwoin1ZiBFjFBVEWLm1ppzTkQAsAQYQdwhTap+dBCRXzkW6g2lIpdqRkYE1v1+AZgEuiRo8G2YaCBo75ZylSCdiMnoYPVefO1k8AYm7rlAjUDi7/ZN18HIffbp5zFO22Vf0bzXfsBQUu4DIJ6P1/t/XowB9RGl4Xj94M62zy+vou2sDUySyhJjTDXpAeL9YFKXaxYnuoL2BRfnzxghj7YKm4liHkszGkOUjtxIYjKM9ncpTnPr4+HDj8j+U5/B5R5k/vfv344m6rfXHb3NSqKvdrs5xKUWeN95nUd69Oi9vpQI0PtfTAn7eE/eLF0Y92eUjrcDISBmrBjbgkrIDPFYCfoCLPgflXOjuIEFgMYAAAAASUVORK5CYII=' 29 | } 30 | }, 31 | 'modern': { 32 | background: '#000000', 33 | backgroundGrid: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZTg0NzU4MC00ODk3LTRkNjAtOWNhYi1mZTk1NzQ5NzhiNjkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTEzOEQwMDc5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTEzOEQwMDY5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDplNDRjOWZiNC0yNzE5LTQ3NDYtYmRmMi0wMmY2ZTA4ZjAxMmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzMwNTNEOTk5MDM1MTFFNDlBMzlFNzY4RjBCNkNENzMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7Y01+zAAAAMklEQVR42mJgGAWjYBSMgkEJGIlUd+j/WjjbjjGYGC1MtHP10DR6FIyCUTAKBikACDAA0NoDCLGGjH8AAAAASUVORK5CYII=', 34 | primary: null, 35 | secondary: null, 36 | stroke: null, 37 | blocks: { 38 | line: '#fa1e1e', 39 | square: '#f1fa1e', 40 | arrow: '#d838cb', 41 | rightHook:'#f5821f', 42 | leftHook: '#42c6f0', 43 | rightZag: '#4bd838', 44 | leftZag: '#fa1e1e' 45 | } 46 | }, 47 | 'retro': { 48 | background: '#000000', 49 | backgroundGrid: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZTg0NzU4MC00ODk3LTRkNjAtOWNhYi1mZTk1NzQ5NzhiNjkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTEzOEQwMDc5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTEzOEQwMDY5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDplNDRjOWZiNC0yNzE5LTQ3NDYtYmRmMi0wMmY2ZTA4ZjAxMmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzMwNTNEOTk5MDM1MTFFNDlBMzlFNzY4RjBCNkNENzMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7Y01+zAAAAMklEQVR42mJgGAWjYBSMgkEJGIlUd+j/WjjbjjGYGC1MtHP10DR6FIyCUTAKBikACDAA0NoDCLGGjH8AAAAASUVORK5CYII=', 50 | primary: null, 51 | secondary: null, 52 | stroke: '#000000', 53 | innerStroke: '#000000', 54 | blocks: { 55 | line: '#fa1e1e', 56 | square: '#f1fa1e', 57 | arrow: '#d838cb', 58 | rightHook:'#f5821f', 59 | leftHook: '#42c6f0', 60 | rightZag: '#4bd838', 61 | leftZag: '#fa1e1e' 62 | } 63 | }, 64 | 'monochrome': { 65 | background: '#000000', 66 | backgroundGrid: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZTg0NzU4MC00ODk3LTRkNjAtOWNhYi1mZTk1NzQ5NzhiNjkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTEzOEQwMDc5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTEzOEQwMDY5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDplNDRjOWZiNC0yNzE5LTQ3NDYtYmRmMi0wMmY2ZTA4ZjAxMmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzMwNTNEOTk5MDM1MTFFNDlBMzlFNzY4RjBCNkNENzMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7Y01+zAAAAMklEQVR42mJgGAWjYBSMgkEJGIlUd+j/WjjbjjGYGC1MtHP10DR6FIyCUTAKBikACDAA0NoDCLGGjH8AAAAASUVORK5CYII=', 67 | primary: '#ffffff', 68 | secondary: '#ffffff', 69 | stroke: '#000000', 70 | innerStroke: '#000000' 71 | }, 72 | 'aerolab': { 73 | background: '#ffffff', 74 | primary: '#ff7b00', 75 | secondary: '#000000' 76 | }, 77 | 'gameboy': { 78 | background: '#C4CFA1', 79 | primary: null, 80 | secondary: null, 81 | stroke: '#414141', 82 | innerStroke: '#414141', 83 | innerSquare: '#000000', 84 | blocks: { 85 | line: '#88926A', 86 | square: '#585E44', 87 | arrow: '#A4AC8C', 88 | rightHook:'#6B7353', 89 | leftHook: '#6B7353', 90 | rightZag: '#595F45', 91 | leftZag: '#595F45' 92 | } 93 | }, 94 | 'vim': { 95 | background: '#000000', 96 | backgroundGrid: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZTg0NzU4MC00ODk3LTRkNjAtOWNhYi1mZTk1NzQ5NzhiNjkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTEzOEQwMDc5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTEzOEQwMDY5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDplNDRjOWZiNC0yNzE5LTQ3NDYtYmRmMi0wMmY2ZTA4ZjAxMmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzMwNTNEOTk5MDM1MTFFNDlBMzlFNzY4RjBCNkNENzMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7Y01+zAAAAMklEQVR42mJgGAWjYBSMgkEJGIlUd+j/WjjbjjGYGC1MtHP10DR6FIyCUTAKBikACDAA0NoDCLGGjH8AAAAASUVORK5CYII=', 97 | primary: '#C2FFAE', 98 | secondary: '#C2FFAE', 99 | stroke: '#000000', 100 | strokeWidth: 3, 101 | innerStroke: null 102 | }, 103 | }; -------------------------------------------------------------------------------- /assets/images/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 12 | 13 | 14 | 16 | 18 | 19 | 20 | 22 | 24 | 25 | 26 | 28 | 30 | 31 | 32 | 34 | 36 | 37 | 38 | 40 | 42 | 43 | 44 | 46 | 48 | 49 | 50 | 52 | 54 | 55 | 56 | 58 | 60 | 61 | 62 | 64 | 66 | 67 | 68 | 70 | 72 | 73 | 74 | 76 | 78 | 79 | 80 | 82 | 84 | 85 | 86 | 88 | 90 | 91 | 92 | 94 | 96 | 97 | 98 | 100 | 102 | 103 | 104 | 106 | 108 | 109 | 110 | 112 | 114 | 115 | 116 | 118 | 120 | 121 | 122 | 124 | 126 | 127 | 128 | 130 | 132 | 133 | 134 | 136 | 138 | 139 | 140 | 142 | 144 | 145 | 146 | 148 | 150 | 151 | 152 | 154 | 156 | 157 | 158 | 160 | 162 | 163 | 164 | 166 | 168 | 169 | 170 | 172 | 174 | 175 | 176 | 178 | 180 | 181 | 182 | 184 | 186 | 187 | 188 | 190 | 192 | 193 | 194 | 196 | 198 | 199 | 200 | 202 | 204 | 205 | 206 | 208 | 210 | 211 | 212 | 214 | 216 | 217 | 218 | 220 | 222 | 223 | 224 | 226 | 228 | 229 | 230 | 232 | 234 | 235 | 236 | 238 | 240 | 241 | 242 | 244 | 246 | 247 | 248 | 250 | 252 | 253 | 254 | 256 | 258 | 259 | 260 | 262 | 264 | 265 | 266 | 268 | 270 | 271 | 272 | 274 | 276 | 277 | 278 | 280 | 282 | 283 | 284 | 286 | 288 | 289 | 290 | 292 | 294 | 295 | 296 | 298 | 300 | 301 | 302 | 304 | 306 | 307 | 308 | 310 | 312 | 313 | 314 | 316 | 318 | 319 | 320 | 322 | 324 | 325 | 326 | 328 | 330 | 331 | 332 | 334 | 336 | 337 | 338 | 340 | 342 | 343 | 344 | 346 | 348 | 349 | 350 | 352 | 354 | 355 | 356 | 358 | 360 | 361 | 362 | 364 | 366 | 367 | 368 | 370 | 372 | 373 | 374 | 376 | 378 | 379 | 380 | 382 | 384 | 385 | 386 | 388 | 390 | 391 | 392 | 394 | 396 | 397 | 398 | 400 | 402 | 403 | 404 | 405 | -------------------------------------------------------------------------------- /dist/blockrain.jquery.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * BlockRain.js 0.2.0 3 | * jQuery plugin that lets you put a playable (and configurable) game of Tetris in your site or just leave it in auto in the background. 4 | * http://aerolab.github.io/blockrain.js/ 5 | * 6 | * Copyright (c) 2015 Aerolab 7 | * 8 | * Released under the MIT license 9 | * http://aerolab.github.io/blockrain.js/LICENSE.txt 10 | */ 11 | !function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(t){var e=0,i=Array.prototype.slice;t.cleanData=function(e){return function(i){var o,n,s;for(s=0;null!=(n=i[s]);s++)try{o=t._data(n,"events"),o&&o.remove&&t(n).triggerHandler("remove")}catch(r){}e(i)}}(t.cleanData),t.widget=function(e,i,o){var n,s,r,a,h={},l=e.split(".")[0];return e=e.split(".")[1],n=l+"-"+e,o||(o=i,i=t.Widget),t.expr[":"][n.toLowerCase()]=function(e){return!!t.data(e,n)},t[l]=t[l]||{},s=t[l][e],r=t[l][e]=function(t,e){return this._createWidget?void(arguments.length&&this._createWidget(t,e)):new r(t,e)},t.extend(r,s,{version:o.version,_proto:t.extend({},o),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(o,function(e,o){return t.isFunction(o)?void(h[e]=function(){var t=function(){return i.prototype[e].apply(this,arguments)},n=function(t){return i.prototype[e].apply(this,t)};return function(){var e,i=this._super,s=this._superApply;return this._super=t,this._superApply=n,e=o.apply(this,arguments),this._super=i,this._superApply=s,e}}()):void(h[e]=o)}),r.prototype=t.widget.extend(a,{widgetEventPrefix:s?a.widgetEventPrefix||e:e},h,{constructor:r,namespace:l,widgetName:e,widgetFullName:n}),s?(t.each(s._childConstructors,function(e,i){var o=i.prototype;t.widget(o.namespace+"."+o.widgetName,r,i._proto)}),delete s._childConstructors):i._childConstructors.push(r),t.widget.bridge(e,r),r},t.widget.extend=function(e){for(var o,n,s=i.call(arguments,1),r=0,a=s.length;a>r;r++)for(o in s[r])n=s[r][o],s[r].hasOwnProperty(o)&&void 0!==n&&(e[o]=t.isPlainObject(n)?t.isPlainObject(e[o])?t.widget.extend({},e[o],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,o){var n=o.prototype.widgetFullName||e;t.fn[e]=function(s){var r="string"==typeof s,a=i.call(arguments,1),h=this;return s=!r&&a.length?t.widget.extend.apply(null,[s].concat(a)):s,this.each(r?function(){var i,o=t.data(this,n);return"instance"===s?(h=o,!1):o?t.isFunction(o[s])&&"_"!==s.charAt(0)?(i=o[s].apply(o,a),i!==o&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+s+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; attempted to call method '"+s+"'")}:function(){var e=t.data(this,n);e?(e.option(s||{}),e._init&&e._init()):t.data(this,n,new o(s,this))}),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{disabled:!1,create:null},_createWidget:function(i,o){o=t(o||this.defaultElement||this)[0],this.element=t(o),this.uuid=e++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),o!==this&&(t.data(o,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===o&&this.destroy()}}),this.document=t(o.style?o.ownerDocument:o.document||o),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:t.noop,_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(t.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var o,n,s,r=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(r={},o=e.split("."),e=o.shift(),o.length){for(n=r[e]=t.widget.extend({},this.options[e]),s=0;o.length-1>s;s++)n[o[s]]=n[o[s]]||{},n=n[o[s]];if(e=o.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];r[e]=i}return this._setOptions(r),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return this.options[t]=e,"disabled"===t&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!e),e&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(e,i,o){var n,s=this;"boolean"!=typeof e&&(o=i,i=e,e=!1),o?(i=n=t(i),this.bindings=this.bindings.add(i)):(o=i,i=this.element,n=this.widget()),t.each(o,function(o,r){function a(){return e||s.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof r?s[r]:r).apply(s,arguments):void 0}"string"!=typeof r&&(a.guid=r.guid=r.guid||a.guid||t.guid++);var h=o.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+s.eventNamespace,c=h[2];c?n.delegate(c,l,a):i.bind(l,a)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(i).undelegate(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?o[t]:t).apply(o,arguments)}var o=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){t(e.currentTarget).addClass("ui-state-hover")},mouseleave:function(e){t(e.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){t(e.currentTarget).addClass("ui-state-focus")},focusout:function(e){t(e.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(e,i,o){var n,s,r=this.options[e];if(o=o||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],s=i.originalEvent)for(n in s)n in i||(i[n]=s[n]);return this.element.trigger(i,o),!(t.isFunction(r)&&r.apply(this.element[0],[i].concat(o))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(o,n,s){"string"==typeof n&&(n={effect:n});var r,a=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),r=!t.isEmptyObject(n),n.complete=s,n.delay&&o.delay(n.delay),r&&t.effects&&t.effects.effect[a]?o[e](n):a!==e&&o[a]?o[a](n.duration,n.easing,s):o.queue(function(i){t(this)[e](),s&&s.call(o[0]),i()})}}),t.widget}),function(t){"use strict";t.widget("aerolab.blockrain",{options:{autoplay:!1,autoplayRestart:!0,showFieldOnStart:!0,theme:null,blockWidth:10,autoBlockWidth:!1,autoBlockSize:24,difficulty:"normal",speed:20,asdwKeys:!0,playText:"Let's play some Tetris",playButtonText:"Play",gameOverText:"Game Over",restartButtonText:"Play Again",scoreText:"Score",onStart:function(){},onRestart:function(){},onGameOver:function(t){},onPlaced:function(){},onLine:function(t,e,i){}},start:function(){this._doStart(),this.options.onStart.call(this.element)},restart:function(){this._doStart(),this.options.onRestart.call(this.element)},gameover:function(){this.showGameOverMessage(),this._board.gameover=!0,this.options.onGameOver.call(this.element,this._filled.score)},_doStart:function(){this._filled.clearAll(),this._filled._resetScore(),this._board.cur=this._board.nextShape(),this._board.started=!0,this._board.gameover=!1,this._board.dropDelay=5,this._board.render(!0),this._board.animate(),this._$start.fadeOut(150),this._$gameover.fadeOut(150),this._$score.fadeIn(150)},pause:function(){this._board.paused=!0},resume:function(){this._board.paused=!1},autoplay:function(t){"boolean"!=typeof t&&(t=!0),this.options.autoplay=t,t&&!this._board.started&&this._doStart(),this._setupControls(!t),this._setupTouchControls(!t)},controls:function(t){"boolean"!=typeof t&&(t=!0),this._setupControls(t)},touchControls:function(t){"boolean"!=typeof t&&(t=!0),this._setupTouchControls(t)},score:function(t){return"undefined"!=typeof t&&parseInt(t)>=0&&(this._filled.score=parseInt(t),this._$scoreText.text(this._filled_score)),this._filled.score},freesquares:function(){return this._filled.getFreeSpaces()},showStartMessage:function(){this._$start.show()},showGameOverMessage:function(){this._$gameover.show()},updateSizes:function(){this._PIXEL_WIDTH=this.element.innerWidth(),this._PIXEL_HEIGHT=this.element.innerHeight(),this._BLOCK_WIDTH=this.options.blockWidth,this._BLOCK_HEIGHT=Math.floor(this.element.innerHeight()/this.element.innerWidth()*this._BLOCK_WIDTH),this._block_size=Math.floor(this._PIXEL_WIDTH/this._BLOCK_WIDTH),this._border_width=2,this._PIXEL_WIDTH=this._block_size*this._BLOCK_WIDTH,this._PIXEL_HEIGHT=this._block_size*this._BLOCK_HEIGHT,this._$canvas.attr("width",this._PIXEL_WIDTH).attr("height",this._PIXEL_HEIGHT)},theme:function(e){return"undefined"==typeof e?this.options.theme||this._theme:("string"==typeof e?(this.options.theme=e,this._theme=t.extend(!0,{},BlockrainThemes[e])):(this.options.theme=null,this._theme=e),("undefined"==typeof this._theme||null===this._theme)&&(this._theme=t.extend(!0,{},BlockrainThemes.retro),this.options.theme="retro"),(isNaN(parseInt(this._theme.strokeWidth))||"number"!=typeof parseInt(this._theme.strokeWidth))&&(this._theme.strokeWidth=2),this._preloadThemeAssets(),void(null!==this._board&&("string"==typeof this._theme.background&&this._$canvas.css("background-color",this._theme.background),this._board.render())))},_theme:{},_$game:null,_$canvas:null,_$gameholder:null,_$start:null,_$gameover:null,_$score:null,_$scoreText:null,_canvas:null,_ctx:null,_create:function(){var e=this;this.theme(this.options.theme),this._createHolder(),this._createUI(),this._refreshBlockSizes(),this.updateSizes(),t(window).resize(function(){}),this._SetupShapeFactory(),this._SetupFilled(),this._SetupInfo(),this._SetupBoard(),this._info.init(),this._board.init();var i=function(){requestAnimationFrame(i),e._board.render()};i(),this.options.autoplay?(this.autoplay(!0),this._setupTouchControls(!1)):(this._setupControls(!0),this._setupTouchControls(!1))},_checkCollisions:function(t,e,i,o){for(var n,s,r=0,a=i.length;a>r;r+=2){if(n=t+i[r],s=e+i[r+1],s>=this._BLOCK_HEIGHT||this._filled.check(n,s))return!0;if(!o&&0>n||n>=this._BLOCK_WIDTH)return!0}return!1},_board:null,_info:null,_filled:null,_drawBackground:function(){if("string"==typeof this._theme.background){if(this._theme.backgroundGrid instanceof Image){if(0===this._theme.backgroundGrid.width||0===this._theme.backgroundGrid.height)return;this._ctx.globalAlpha=1;for(var t=0;to;o+=2)i[o]r&&(r=i[o]),i[o+1]h&&(h=i[o+1]);return{left:s,right:r,top:a,bottom:h,width:r-s,height:h-a}}}),this.init()}var i=this;null===this._shapeFactory&&(this._shapeFactory={line:function(){return new e(i,i._shapes.line,!1,"line")},square:function(){return new e(i,i._shapes.square,!1,"square")},arrow:function(){return new e(i,i._shapes.arrow,!1,"arrow")},leftHook:function(){return new e(i,i._shapes.leftHook,!1,"leftHook")},rightHook:function(){return new e(i,i._shapes.rightHook,!1,"rightHook")},leftZag:function(){return new e(i,i._shapes.leftZag,!1,"leftZag")},rightZag:function(){return new e(i,i._shapes.rightZag,!1,"rightZag")}})},_SetupFilled:function(){var t=this;null===this._filled&&(this._filled={data:new Array(t._BLOCK_WIDTH*t._BLOCK_HEIGHT),score:0,toClear:{},check:function(t,e){return this.data[this.asIndex(t,e)]},add:function(e,i,o,n,s,r){e>=0&&e=0&&i=0;i--)this.data[i]=i>=t._BLOCK_WIDTH?this.data[i-t._BLOCK_WIDTH]:void 0},checkForClears:function(){var e,i,o,n,s=t._board.lines,r=[];for(e=0,i=this.data.length;i>e;e++)n=this.asX(e),0==n&&(o=0),this.data[e]&&"undefined"!=typeof this.data[e]&&"string"==typeof this.data[e].blockType&&(o+=1),n==t._BLOCK_WIDTH-1&&o==t._BLOCK_WIDTH&&r.push(this.asY(e));for(e=0,i=r.length;i>e;e++)this._popRow(r[e]),t._board.lines++,t._board.lines%10==0&&t._board.dropDelay>1&&(t._board.dropDelay*=.9);var a=t._board.lines-s;this._updateScore(a)},_updateScore:function(e){if(!(0>=e)){var i=[0,400,1e3,3e3,12e3];e>=i.length&&(e=i.length-1),this.score+=i[e],t._$scoreText.text(this.score),t.options.onLine.call(t.element,e,i[e],this.score)}},_resetScore:function(){this.score=0,t._$scoreText.text(this.score)},draw:function(){for(var e,i=0,o=this.data.length;o>i;i++)if(void 0!==this.data[i]){e=this.asY(i);var n=this.data[i];t._board.drawBlock(this.asX(i),e,n.blockType,n.blockVariation,n.blockIndex,n.blockOrientation)}}})},_SetupInfo:function(){var t=this;this._info={mode:t.options.difficulty,modes:["normal","nice","evil"],modesY:170,autopilotY:null,init:function(){this.mode=t.options.difficulty},setMode:function(e){this.mode=e,t._board.nextShape(!0)}}},_SetupBoard:function(){var e=this,i=this._info;this._board={animateDelay:1e3/e.options.speed,animateTimeoutId:null,cur:null,lines:0,dropCount:0,dropDelay:5,holding:{left:null,right:null,drop:null},holdingThreshold:200,started:!1,gameover:!1,renderChanged:!0,init:function(){this.cur=this.nextShape(),e.options.showFieldOnStart&&(e._drawBackground(),e._board.createRandomBoard(),e._board.render()),this.showStartMessage()},showStartMessage:function(){e._$start.show()},showGameOverMessage:function(){e._$gameover.show()},nextShape:function(o){var n,s,r,a=this.next;if(n="nice"==i.mode||"evil"==i.mode?e._niceShapes:e._randomShapes(),e.options.no_preview){if(this.next=null,o)return null;if(s=n(e._filled,e._checkCollisions,e._BLOCK_WIDTH,e._BLOCK_HEIGHT,i.mode),!s)throw new Error("No shape returned from shape function!",n);s.init(),r=s}else{if(s=n(e._filled,e._checkCollisions,e._BLOCK_WIDTH,e._BLOCK_HEIGHT,i.mode),!s)throw new Error("No shape returned from shape function!",n);if(s.init(),this.next=s,o)return null;r=a||this.nextShape()}return e.options.autoplay&&(e._niceShapes(e._filled,e._checkCollisions,e._BLOCK_WIDTH,e._BLOCK_HEIGHT,"normal",r),r.orientation=r.best_orientation,r.x=r.best_x),"undefined"!=typeof e._theme.complexBlocks?r.blockVariation=t.isArray(e._theme.complexBlocks[r.blockType])?e._randInt(0,e._theme.complexBlocks[r.blockType].length-1):null:"undefined"!=typeof e._theme.blocks&&(r.blockVariation=t.isArray(e._theme.blocks[r.blockType])?e._randInt(0,e._theme.blocks[r.blockType].length-1):null),r},animate:function(){var t=!1,i=!1,o=!1,n=Date.now();if(this.animateTimeoutId&&clearTimeout(this.animateTimeoutId),!this.paused&&!this.gameover&&(this.dropCount++,(this.dropCount>=this.dropDelay||e.options.autoplay||this.holding.drop&&n-this.holding.drop>=this.holdingThreshold)&&(t=!0,i=!0,this.dropCount=0),this.holding.left&&n-this.holding.left>=this.holdingThreshold&&(i=!0,this.cur.moveLeft()),this.holding.right&&n-this.holding.right>=this.holdingThreshold&&(i=!0,this.cur.moveRight()),t)){var s=this.cur,r=s.x,a=s.y,h=s.getBlocks();if(e._checkCollisions(r,a+1,h,!0)){t=!1;for(var l=0,c=0;ct;t++)for(o=0,n=e._randChoice([e._randInt(0,8),e._randInt(5,9)]);n>o;o++)s&&e._randInt(0,3)||(s=e._randChoice(r)),e._filled.add(t,e._BLOCK_HEIGHT-o,s,e._randInt(0,3),null,e._randInt(0,3));e._board.render(!0)},render:function(t){(this.renderChanged||t)&&(this.renderChanged=!1,e._ctx.clearRect(0,0,e._PIXEL_WIDTH,e._PIXEL_HEIGHT),e._drawBackground(),e._filled.draw(),this.cur.draw())},drawBlock:function(t,i,o,n,s,r,a){t*=e._block_size,i*=e._block_size,a="boolean"==typeof a?a:!1;var h=e._theme.strokeWidth,l=Math.round(.23*e._block_size),c=Math.round(.3*e._block_size),d=this.getBlockColor(o,n,s,a);if(e._ctx.globalAlpha=1,d instanceof Image){if(e._ctx.globalAlpha=1,0===d.width||0===d.height)return;if("undefined"!=typeof e._theme.blocks&&null!==e._theme.blocks)e._ctx.drawImage(d,0,0,d.width,d.height,t,i,e._block_size,e._block_size);else if("undefined"!=typeof e._theme.complexBlocks&&null!==e._theme.complexBlocks){("undefined"==typeof s||null===s)&&(s=0);var u=function(t,i,o){var n=e._shapes[i][0],s=Math.min(n[0],n[2],n[4],n[6]),r=Math.max(n[0],n[2],n[4],n[6]),a=Math.min(n[1],n[3],n[5],n[7]),h=Math.max(n[1],n[3],n[5],n[7]),l=r-s+1,c=h-a+1,d=t.width/l,u=t.height/c;return{x:d*(n[2*o]-s),y:u*Math.abs(a-n[2*o+1]),w:d,h:u}},g=u(d,o,s);e._ctx.save(),e._ctx.translate(t,i),e._ctx.translate(e._block_size/2,e._block_size/2),e._ctx.rotate(-Math.PI/2*r),e._ctx.drawImage(d,g.x,g.y,g.w,g.h,-e._block_size/2,-e._block_size/2,e._block_size,e._block_size),e._ctx.restore()}else e._ctx.fillStyle="#ff0000",e._ctx.fillRect(t,i,e._block_size,e._block_size)}else"string"==typeof d&&(e._ctx.fillStyle=d,e._ctx.fillRect(t,i,e._block_size,e._block_size),"string"==typeof e._theme.innerShadow&&(e._ctx.globalAlpha=1,e._ctx.strokeStyle=e._theme.innerShadow,e._ctx.lineWidth=1,e._ctx.strokeRect(t+1,i+1,e._block_size-2,e._block_size-2)),"string"==typeof e._theme.stroke&&(e._ctx.globalAlpha=1,e._ctx.fillStyle=e._theme.stroke,e._ctx.strokeStyle=e._theme.stroke,e._ctx.lineWidth=h,e._ctx.strokeRect(t,i,e._block_size,e._block_size)),"string"==typeof e._theme.innerStroke&&(e._ctx.fillStyle=e._theme.innerStroke,e._ctx.fillRect(t+l,i+l,e._block_size-2*l,h),e._ctx.fillRect(t+l,i+l+h,h,e._block_size-2*l-h)),"string"==typeof e._theme.innerSquare&&(e._ctx.fillStyle=e._theme.innerSquare,e._ctx.globalAlpha=.2,e._ctx.fillRect(t+c,i+c,e._block_size-2*c,e._block_size-2*c)));e._ctx.globalAlpha=1},getBlockColor:function(i,o,n,s){var r=function(e,i){return t.isArray(e)?null!==i&&"undefined"!=typeof e[i]?e[i]:e.length>0?e[0]:null:e};return"boolean"!=typeof s&&(s=!0),s?"string"==typeof e._theme.primary&&""!==e._theme.primary?e._theme.primary:"undefined"!=typeof e._theme.blocks&&null!==e._theme.blocks?r(e._theme.blocks[i],o):r(e._theme.complexBlocks[i],o):"string"==typeof e._theme.secondary&&""!==e._theme.secondary?e._theme.secondary:"undefined"!=typeof e._theme.blocks&&null!==e._theme.blocks?r(e._theme.blocks[i],o):r(e._theme.complexBlocks[i],o)}},e._niceShapes=e._getNiceShapes()},_randInt:function(t,e){return t+Math.floor(Math.random()*(1+e-t))},_randSign:function(){return 2*this._randInt(0,1)-1},_randChoice:function(t){return t[this._randInt(0,t.length-1)]},_preloadThemeAssets:function(){var e=this,i=new RegExp("^#[A-F0-9+]{3,6}","i"),o=(new RegExp("^data:image/(png|gif|jpg);base64,","i"),function(){e._board&&e._board.render(!0)}),n=function(t){var e=t;return i.test(e)?t=e:(t=new Image,t.src=e,t.onload=o),t},s=function(e){if(t.isArray(e)&&e.length>0)for(var i=0;i
'),this._$gameholder.css("position","relative").css("width","100%").css("height","100%"),this.element.html("").append(this._$gameholder),this._$canvas=t(''),"string"==typeof this._theme.background&&this._$canvas.css("background-color",this._theme.background),this._$gameholder.append(this._$canvas),this._canvas=this._$canvas.get(0),this._ctx=this._canvas.getContext("2d")},_createUI:function(){var e=this;e._$score=t('
'+this.options.scoreText+'
0
').hide(),e._$scoreText=e._$score.find(".blockrain-score-num"),e._$gameholder.append(e._$score),e._$start=t('
'+this.options.playText+'
'+this.options.playButtonText+"
").hide(),e._$gameholder.append(e._$start),e._$start.find(".blockrain-start-btn").click(function(t){t.preventDefault(),e.start()}),e._$gameover=t('
'+this.options.gameOverText+'
'+this.options.restartButtonText+"
").hide(),e._$gameover.find(".blockrain-game-over-btn").click(function(t){t.preventDefault(),e.restart()}),e._$gameholder.append(e._$gameover),this._createControls()},_createControls:function(){var e=this;e._$touchLeft=t('').appendTo(e._$gameholder),e._$touchRight=t('').appendTo(e._$gameholder),e._$touchRotateRight=t('').appendTo(e._$gameholder),e._$touchRotateLeft=t('').appendTo(e._$gameholder),e._$touchDrop=t('').appendTo(e._$gameholder)},_refreshBlockSizes:function(){this.options.autoBlockWidth&&(this.options.blockWidth=Math.ceil(this.element.width()/this.options.autoBlockSize))},_getNiceShapes:function(){function t(t,e,i,n,s,r,a){var h,l,c,d,u=e.length,g=0,A={};for(h=0;u>h;h+=2)g+=t[o._filled.asIndex(i+e[h],n+e[h+1])]||0;for(h=0;u>h;h+=2)l=e[h],c=e[h+1],(void 0===A[l]||A[l]n+c;c++,h++)if(!o._filled.check(i+l,n+c)){d+=0==h?2:1;break}return g-=d}function e(){for(var t in n)n[t].x=0,n[t].y=-1}var i,o=this,n={};for(var i in this._shapeFactory)n[i]=this._shapeFactory[i]();var s=function(i,s,r,a,h,l){l||e();var c,d,u,g,A,f,p,b,m,k,_,I,v,y,C,w=new Array(r*a),B="evil"==h,G=999*(B?1:-1);for(c=0;r>c;c++)for(d=0;a>=d;d++)if(d==a||i.check(c,d)){for(u=d-4;d>u;u++)w[i.asIndex(c,u)]=u;break}var D=void 0===l?n:{cur:l};for(g in D){for(A=D[g],v=-999,f=0;f<(A.symmetrical?2:4);f++)for(p=A.getBlocks(f),b=A.getBounds(p),c=-b.left;cv&&(v=m,y=f,C=c);break}(B&&G>v||!B&&v>G)&&(k=A,G=v,_=y,I=C)}return k.best_orientation=_,k.best_x=I,k};return s.no_preview=!0,s},_randomShapes:function(){var e=[];return t.each(this._shapeFactory,function(t,i){e.push(i)}),this._randChoice(e)},_setupControls:function(e){function i(t){var e={stopKeys:{37:1,38:1,39:1,40:1}},i=e.stopKeys[t.keyCode]||e.moreStopKeys&&e.moreStopKeys[t.keyCode];return i&&t.preventDefault(),i}function o(t){return"safekeypress."+t.keyCode}function n(e){var i=o(e);return t.data(this,i,(t.data(this,i)||0)-1),c.call(this,e)}function s(e){return t.data(this,o(e),0),d.call(this,e),i(e)}var r=this,a=function(t){return t?void(r._board.holding.left||(r._board.cur.moveLeft(),r._board.holding.left=Date.now(),r._board.holding.right=null)):void(r._board.holding.left=null)},h=function(t){return t?void(r._board.holding.right||(r._board.cur.moveRight(),r._board.holding.right=Date.now(),r._board.holding.left=null)):void(r._board.holding.right=null)},l=function(t){return t?void(r._board.holding.drop||(r._board.cur.drop(),r._board.holding.drop=Date.now())):void(r._board.holding.drop=null)},c=function(t){if(!r._board.cur)return!0;var e=!1;if(e=!0,r.options.asdwKeys)switch(t.keyCode){case 65:a(!0);break;case 68:h(!0);break;case 83:l(!0);break;case 87:r._board.cur.rotate("right")}switch(t.keyCode){case 37:a(!0);break;case 39:h(!0);break;case 40:l(!0);break;case 38:r._board.cur.rotate("right");break;case 88:r._board.cur.rotate("right");break;case 90:r._board.cur.rotate("left");break;default:e=!1}return e&&t.preventDefault(),!e},d=function(t){if(!r._board.cur)return!0;var e=!1;if(e=!0,r.options.asdwKeys)switch(t.keyCode){case 65:a(!1);break;case 68:h(!1);break;case 83:l(!1)}switch(t.keyCode){case 37:a(!1);break;case 39:h(!1);break;case 40:l(!1);break;default:e=!1}return e&&t.preventDefault(),!e};t(document).unbind("keydown.blockrain").unbind("keyup.blockrain"),r.options.autoplay||e&&t(document).bind("keydown.blockrain",n).bind("keyup.blockrain",s)},_setupTouchControls:function(t){var e=this,i=function(t){t.preventDefault(),e._board.cur.moveLeft(),e._board.holding.left=Date.now(),e._board.holding.right=null,e._board.holding.drop=null},o=function(t){t.preventDefault(),e._board.cur.moveRight(),e._board.holding.right=Date.now(),e._board.holding.left=null,e._board.holding.drop=null},n=function(t){t.preventDefault(),e._board.cur.drop(),e._board.holding.drop=Date.now()},s=function(t){t.preventDefault(),e._board.holding.left=null},r=function(t){t.preventDefault(),e._board.holding.right=null},a=function(t){t.preventDefault(),e._board.holding.drop=null},h=function(t){t.preventDefault(),e._board.cur.rotate("left")},l=function(t){t.preventDefault(),e._board.cur.rotate("right")};e._$touchLeft.unbind("touchstart touchend click"),e._$touchRight.unbind("touchstart touchend click"),e._$touchRotateLeft.unbind("touchstart touchend click"),e._$touchRotateRight.unbind("touchstart touchend click"),e._$touchDrop.unbind("touchstart touchend click"),!e.options.autoplay&&t?(e._$touchLeft.show().bind("touchstart click",i).bind("touchend",s),e._$touchRight.show().bind("touchstart click",o).bind("touchend",r),e._$touchDrop.show().bind("touchstart click",n).bind("touchend",a),e._$touchRotateLeft.show().bind("touchstart click",h),e._$touchRotateRight.show().bind("touchstart click",l)):(e._$touchLeft.hide(),e._$touchRight.hide(),e._$touchRotateLeft.hide(),e._$touchRotateRight.hide(),e._$touchDrop.hide())}})}(jQuery),window.BlockrainThemes={custom:{background:"#040304",backgroundGrid:"data:image/png;base64,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", 12 | complexBlocks:{line:["assets/blocks/custom/line.png","assets/blocks/custom/line.png"],square:["assets/blocks/custom/square.png"],arrow:"assets/blocks/custom/arrow.png",rightHook:["assets/blocks/custom/rightHook.png"],leftHook:"assets/blocks/custom/leftHook.png",rightZag:["assets/blocks/custom/rightZag.png"],leftZag:"assets/blocks/custom/leftZag.png"}},candy:{background:"#040304",backgroundGrid:"data:image/png;base64,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",blocks:{line:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACuklEQVR4Xi2MzW4cRRSFz/2p6p4eT2zjjE2MHBQWvAALNjwDS8SOFc/FIyCxQgh2LFHkBQgJyQo/wXKCEZ7x9E9VV93LBPNJ516dxXfo/U8+HTZ9uzrZympTjLo4DbtDiBpXSBGMocI5lkaMhKv0fz+LVX9P6ZuvvxqBby+3L3eJu6Zt27DL4qgIWW0KsxPC3Kjxz5fPT3z48csvtHSHd0C/1374RddPX/9xK6JdcjEutNfqFJMBsQat3By+i/7VxqJ6c/zd5avvn1+N7dl2V9Ad92M2ViI2ksyWSJ2QXQXc5/H25jYcHHKl1YYebcJqw/rW03OOzfr89NHbR8vH3Wq9Olofrddni+XhycXJhBSkKFLxWeHBZFFDVyD343Rzc/0XeYSXeXZIJaam2V9pLsBOtRIKYAorXqvAg8giaKsCKw1zJAGFbKhwtxrdG9E3BQxAIW1xyYUKUIwNxMAwDEwuSgA5iAw2l5ITOeE/GLRMihIOsnQZnKqOlWXRUWidyYkFpCxtCF1s8D+seBggYVYRhChkqqjmld3NKhhu1XKuKUf4g6egEitkvqc5ewo+3ZOVZJO4Q4OSEDGRRyAQkYH8QfMUCR07KS8DIsO8xhjcnUXnSv4GMRYShSUG2MFCeby/awOJFyvF3TU22ckk3E3FQjci+mJVggwz12rKVEvWOk3dwWpIr7ezrU4XZ+9ciBAxWCVlhDb2o5cZTgBR17R3w45hgg8/fu+Dj643adZVXzCmebsbp5T6fhr2L9W8z5xLNsyDpl2btrsXPynS9NvVVc28xzMLPDCUYbVUMy+TMgdinupCEapdvPv0lqGwjW9fHsXjF39eIzRpnFbLdiy918qCWmclnq3mcWhVnzw5v+83XYz0+LPP/8lL704NB3BBdbCDKlChAq8QgRvmGSFouyo3vz7Lr/8FMHqie3VCpNQAAAAASUVORK5CYII=",square:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACfUlEQVR4Xh3LvY5cRRBA4VNV3ffe+fEaZARgWfBExEhEZEg8A69AgkC8AzEiICMgJCdAxggsGRuW3Z3dmenbXVWskT6d7MiXnz3qclu87esm1qW3NteRuqaCIAmQABwPvPU2NyeaUa6P159/9QV3l/HqlWqN41El0PaadEJAoZBKqS9+eybL/tvvvi8PrHA4ku33pz9v5rafKmc0I7QhbiGaJSikyeCh1T7OG6fMluOvP/5+8csb+/RxhUtlEXA5KUMpiEpWwZKU3D799Zl1CtpEjsoh++HRxUMBVhgry4yUXLvstnE8qWi/HZndTEwpppj5XLIg7fZ4+fJlb91jzSlGhjc2O7RMj995nApRIRW0BHRl9UXLona6PYiGGKpaa50qPtQ96/5BCgkpBKghpI7VJZK5bmYju5IxQkZONqtbu+txd5ZEQFI0KaRRJxEZY0wjh/dqKqbZ/z9tqmJIqpQSnaD8T9sYkGqWmuTIZHgoWYupKh4SqSQimqrJfeV1gTECF4NKmUHwDFRqNSuJjMTxFQANNKGUyTBxYqSX6J6USdc1BquYFhEMFEQCUvSeC5rheL/Y74kAvX/OPXRZojIkqHkaLpMwWdYJm1fHlZIJotdXN7tFtczvvfuB5MIyRZwQ11pora2BTKOvva3zPKtStpsKLNNmmcr53xtFMtLaGLSR61IKKaPHenO1L2+qThqrn5FvPuGjjz8s4x+NI6Ptdvtxckywo0cjstZZZfZhNhSWNuoPP/5Udhebc8+tbp4//zPd6dcaGtJtWtUiVkhTWSJkTn3y5P15M19ervL1p9UZFzX9zHYmO1Ph3KFQK+rkIBMScbY7DicOzn+QRoW5iamqhgAAAABJRU5ErkJggg==",arrow:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACsklEQVR4XhWPu25bVxREZz/OuQ9RVKhXjBSu8gX5h+QD0udD8ilByjRpUqZxa6RxY8DuYlhwHhAc2qRIieK9vOfsvUMNBoPVrGLoh6+++7y7mbFfTNIVdShCxCGuAgE8tSilhOVWU6lrtPjPK33ffvvb6xd4KG9/+f1kenIYoAgOIc+AF9u5Rdteuvubty9LU168fqW9z7AFanr36uPZSOIgWHB1IJABKE0keSr3QdLolXitjw1n717++sfPP/7Ula6pfbYmeU7eaBybnzg6ewwpT8DW/vth2acFkzf9Pi0OOU1+/eVlM2/m14vZ+Rfz88t+Np+fnZ8tns1OL66vLss0FIughgppDumLzIpmYBrHz+uVsZVSsraorJoMQU5dOs3K3jaiSXGciNYoG3cQcbJjwiKC3Ny9ljhEEUlGBnh4IJwR+qQ6q7FbuMPBLEQCVjaYA0mYwcyIY6p5qYFQQqOexRMhHOqg6sV8mtiqQki51gSHV6YAMYMMxgIC2IOcBcIsQipBBCIjNqEQBWARjjAOHAtSh1eqk9bqLpBKQUSZE4ccIqpJFnWQiRSKypjUA1DgEDw5janNkgA4zKmGQtpgsNqhMoRCmRni4AgKJh6DB842TffENWWqU+m448eYje186GZT31nXo5EqPhUGIqoGwd1gtWFtRBeLxcXF1TydYh+td1E5lMdpOOxGr9bPOzdrtFGWk2lAg84e9/fYbGmsync0xD7mfkITgUMbJaKc26GOVn2sB61Gf958OE992wsoQjSSjBHUwEmlISTsxjEsOIsxP3v+/M3tey3wrRVh29wuA2Vo3Xoe3KP6Endhzh3v92NjKefcXZzETKxR+Sa+vt2s3/3z127YrYfN+mGz2m4+rT+tNuu77d3yfvn3+vbh8eH4bb3dLrer97c3q7L6H15gvODKB5u4AAAAAElFTkSuQmCC",rightHook:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACqElEQVR4Xh3PO2tlZRSH8f9a73XvPTkTExl1dLAIKFpNY2Fl4UcT7G3FwmIaO3sbEfQjWAxDAkIORDHJyXFf3stayzC/9qke+ubrF0u7zqwfsJNFXEKtCAJriBGBoB0gNAZ5WIekcC0f+br8++3Pr1AP5Y/f6Xgfx4RqoB2kI27QgkYQw5BA2L95M+vTn379y0c2HI+Y5Ob6z3B/M/ZmlTieV7ISj9rXZ2n338NciEMedGshJacbZ9X16vK3H76vh/1paCOWiWvos5M1U9llLIebKeqz0zG4PmZ/dfl6XWc/9p4Ox/fMwnIcXrwL6ohPg54OZhYTUUc+w1YQ83z3kMadEKdp8EmE54cnKifTBLOr17cqtwIf4gAuKhUd8Lh4+TKPowjyOK1l8cxAm9nK2nWnsQeAyNtgldnClCLntkrRrTBcFyPjYRg8AEAY4JDhkhp7uOBIRbyqrmK+KcBm1qU30UbSxHcGnIGpKYk63dQxnC2sPcWo2slZUCCGYXPkkBnUqjcCSAGFsaOUQk5koqUqPFV5G2sDai+tG3vv6ZF3BojBzFrvpeij4KtDZTjPXTWGBA91uWJTo1WkqTAZoAbpT3ejd0YOBW1zoAHE/tG8FThm52KOLnDv1dA8DACTwbRU6TxSaX1WZII/1qBgwLvWtgN6ieQc2hC9hwLGTFS35eTJ7uOL5xxTkZI44l7BDGpwBke8FFCA9Pj2EAipHbd8Qre3fxOMDWykGryyM2Vv67JwmCJ7cQRRM6JXX+CrLz97/uHJ4bgHFUdKBi8B5gECLLAys4grAkr5Vt758ZdLTwhuPNvfHP7ZPzjrBAHYLBlChwPQ+jrtpq2UJv3i0/clni/Y03efYzxPvZdBkAzeAKATukENAoTA86ynZ3GrVQl3Eu/yJ/8D33mmeKR3Cz8AAAAASUVORK5CYII=",leftHook:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACq0lEQVR4Xg3HO24mVRBH8X/Vrfv4ut02BjS8GSBAQuyCmE0gwSLICFgCBLASAhLiiQjQICFBMAMSFn63v+77qCp89EsO5U+/rus/0zQPPW8thXRQABLAjtHAAZ2gzGk2HRCG1YMPwgdf/fnXj1fX+O7732s/A0kzbwEUCW5Fgh8HGVdFTOn5H79NiZ/98rPATBVS8OzX5xTehYsxd3KFwXcGEljVOGVJ8a7W4Q4YT8sb33z70xdf/oB8HufzhjI0m2a3JLykuAyV4RGxrLVN5+f/3dxSKXJc59qfUk77djhdXhGx0/mMAg/rpm30bXq97Fp3su1mrMe19e46BLLw9Nb1w0WaZoO+fPmCNbTW3D1Fcjci77Cnn3wMhCBpWU7vuwqo3evgaar6QHRqfRXKhQiELFG1O6H3MZUyLpTIx24UMkNASbqZwZiN3AQsgKhZ6/VYR9OcDw/blg5xmKqPnIRBLQUZw4iIWQKydRcEcvLOOZ2A80Nv8SRv1iiHQWPXewbztm3MbObMYgpGCMwiwgwAIhJCAGBmjMD+KDJJThJzTI8TKZm5E9S7U3c0s6PrkVujvYbm0Qr1iceJ+GZ9772OMawNDNAgVm8cADcAQSgzCSiChZj8MRLwXCTPufQEC8SlVKPWNTJJ4BTDcds58tCaMsVoIQ8Nq2AgS97uVg2h7v29Dz86W86MGqB922F+djjsdbWE0eu233fbwF0opd57KYU43l5ewQ43N7d17CwUHJnlsl4QmUwkJJKZ5uXaLdBrnzl6EGbTbV2nVIiMuMU44EMwMjn76GMHeWAKhKuLvyXoC+F3IvXrfy9zmO/WKyUM6c1riWUY7btKiA+9UkyvPnk7KFMPtLz/uS9vrjVFLNqTUSEJNLN5hQL7gIXpsGytO0ekCduR/fg/hV+olVqSm3YAAAAASUVORK5CYII=",rightZag:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACt0lEQVR4Xg3LOW6eVRQG4PcM937DP9hYlkgUQ6RQsAiEWAC7YCWUtGyAFqhpEHRI0CCBIjpHJBSxEhzkxP6H+93pHPz0D3358IsbuyY/XlCs7/YU5zjFZgdGp07BEDq4KXwA0PvuqIfDGbT0u69/+hZvr/DrH1gc1WENwUAGM3RDcXQGRbA9/e3nJPX3F5dqdY/ja8ztx++/+YhX5S6P47REODW2Pra+qsbOR5VFWwjHVPKJJF1FevPn019++O7jeYo3h5VG8Ua5OLnCh25T7+RwYfZavVz993q5OehccfImnV3nqdLjD54gTiDAF3cnEJrBAbZNSS//vTKP1FcTk0ppsfYzkpEt58Pls8vb29vTabDWYZJzjsqnJ+vHjx9tVvf3qG3QVpXJ0Y5L2xWmYbPt7W5WeK7RKUqICic7poQY6q4Fw2AUDSykUGUlQ0cUy3XUqCxm8Obe4SypVoRwOC7kLE5szIoBHsmlO6NJO3Qv5GEozI3IiE25K2EeLAiYADiBOwi51NLdCRrGcQ5xTLVUcg1BVeFszXtaWinkIAcALigQDwISby0Vq3dpR8IA2r1cKNfZRTq9F2c1iLuYqQcHg2Dmvbam08QUG1V07zASqDCLouSSE0tojCbGablFoMgkpMxht9QukvICASIXtNLy7rDDakVDeGepzpIUup1mlIZs5Dbo9OknnwEELGgZJgBhHHDYIx/v8/r98+d/P2cVVSOkitRPN9uXfz0j2rRSh1CZDKRmFomgnns62Wyvrq+ncTy2JJ/rRXv76vx04ymr83pci9gYRYISS4N3cgRKvYb15EHOHzy8fPaPgtMe8zHG5y8uH6y3wa7LPbNOIIkQRpCOZt7KzatHFx+Ww0Ki9NX8ZHWy7Sltchtz2aj32nicjZkpLr1m760vp5tN2e8jtHX0Yf4f3da+1L4oEEQAAAAASUVORK5CYII=",leftZag:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAACtElEQVR4Xg2Lu25cZRhF93f5L3OOPeOQmJuDhEIHDa/CC/B4SHSICqS0CERDE2MJAYKEmITEcewZz/nvH7O0taq16eTL++P66nhCDegOAEhghFYhDDM0hSgowQkKkDIwJi0pP/72G9j24vIi8S7nN34lYG1VyOKg0uVKFFIiY/XL+R8s977+6nvttBMkovTDz9/Np3G3fTlvYkoFJswzaxtya2haQ0nUdGa2PLY6GD/9+vjJ+Y+bD+K2vFxtrLS3cQq9t1rLwUZ7IpuOAmQQ8u9/PgFDWbG5708/jK/Ti9OzExErhYVU1TMrCZqV7fY2Or2+uQ5H7zgPMNQF5HL7+upZeFeHLU//etrraM2YedQBAXsnoPXHn8yrcHVzE0LICWoECTQf+SG19dRqK3tMUxSRZtkIZtqbsblW+vF8/Pzy1XoNvdthjDas7He7swdno+JkM21v997r6A1MIKNBwiCiXssqhNsbcAwQosPTeek1MzBa947NmnewYcGR8Oh1sZG8s5LvQoACaK0Yegi+965MNWXnxIAx0AdyWnqDMjuh1KoIkYGNUPqh0zHaYcpwoin1ZiBFjFBVEWLm1ppzTkQAsAQYQdwhTap+dBCRXzkW6g2lIpdqRkYE1v1+AZgEuiRo8G2YaCBo75ZylSCdiMnoYPVefO1k8AYm7rlAjUDi7/ZN18HIffbp5zFO22Vf0bzXfsBQUu4DIJ6P1/t/XowB9RGl4Xj94M62zy+vou2sDUySyhJjTDXpAeL9YFKXaxYnuoL2BRfnzxghj7YKm4liHkszGkOUjtxIYjKM9ncpTnPr4+HDj8j+U5/B5R5k/vfv344m6rfXHb3NSqKvdrs5xKUWeN95nUd69Oi9vpQI0PtfTAn7eE/eLF0Y92eUjrcDISBmrBjbgkrIDPFYCfoCLPgflXOjuIEFgMYAAAAASUVORK5CYII="}},modern:{background:"#000000",backgroundGrid:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZTg0NzU4MC00ODk3LTRkNjAtOWNhYi1mZTk1NzQ5NzhiNjkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTEzOEQwMDc5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTEzOEQwMDY5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDplNDRjOWZiNC0yNzE5LTQ3NDYtYmRmMi0wMmY2ZTA4ZjAxMmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzMwNTNEOTk5MDM1MTFFNDlBMzlFNzY4RjBCNkNENzMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7Y01+zAAAAMklEQVR42mJgGAWjYBSMgkEJGIlUd+j/WjjbjjGYGC1MtHP10DR6FIyCUTAKBikACDAA0NoDCLGGjH8AAAAASUVORK5CYII=",primary:null,secondary:null,stroke:null,blocks:{line:"#fa1e1e",square:"#f1fa1e",arrow:"#d838cb",rightHook:"#f5821f",leftHook:"#42c6f0",rightZag:"#4bd838",leftZag:"#fa1e1e"}},retro:{background:"#000000",backgroundGrid:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZTg0NzU4MC00ODk3LTRkNjAtOWNhYi1mZTk1NzQ5NzhiNjkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTEzOEQwMDc5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTEzOEQwMDY5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDplNDRjOWZiNC0yNzE5LTQ3NDYtYmRmMi0wMmY2ZTA4ZjAxMmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzMwNTNEOTk5MDM1MTFFNDlBMzlFNzY4RjBCNkNENzMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7Y01+zAAAAMklEQVR42mJgGAWjYBSMgkEJGIlUd+j/WjjbjjGYGC1MtHP10DR6FIyCUTAKBikACDAA0NoDCLGGjH8AAAAASUVORK5CYII=",primary:null,secondary:null,stroke:"#000000",innerStroke:"#000000",blocks:{line:"#fa1e1e",square:"#f1fa1e",arrow:"#d838cb",rightHook:"#f5821f",leftHook:"#42c6f0",rightZag:"#4bd838",leftZag:"#fa1e1e"}},monochrome:{background:"#000000",backgroundGrid:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZTg0NzU4MC00ODk3LTRkNjAtOWNhYi1mZTk1NzQ5NzhiNjkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTEzOEQwMDc5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTEzOEQwMDY5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDplNDRjOWZiNC0yNzE5LTQ3NDYtYmRmMi0wMmY2ZTA4ZjAxMmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzMwNTNEOTk5MDM1MTFFNDlBMzlFNzY4RjBCNkNENzMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7Y01+zAAAAMklEQVR42mJgGAWjYBSMgkEJGIlUd+j/WjjbjjGYGC1MtHP10DR6FIyCUTAKBikACDAA0NoDCLGGjH8AAAAASUVORK5CYII=",primary:"#ffffff",secondary:"#ffffff",stroke:"#000000",innerStroke:"#000000"},aerolab:{background:"#ffffff",primary:"#ff7b00",secondary:"#000000"},gameboy:{background:"#C4CFA1",primary:null,secondary:null,stroke:"#414141",innerStroke:"#414141",innerSquare:"#000000",blocks:{line:"#88926A",square:"#585E44",arrow:"#A4AC8C",rightHook:"#6B7353",leftHook:"#6B7353",rightZag:"#595F45",leftZag:"#595F45"}},vim:{background:"#000000",backgroundGrid:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZTg0NzU4MC00ODk3LTRkNjAtOWNhYi1mZTk1NzQ5NzhiNjkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTEzOEQwMDc5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTEzOEQwMDY5MDQyMTFFNDlBMzlFNzY4RjBCNkNENzMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDplNDRjOWZiNC0yNzE5LTQ3NDYtYmRmMi0wMmY2ZTA4ZjAxMmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzMwNTNEOTk5MDM1MTFFNDlBMzlFNzY4RjBCNkNENzMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7Y01+zAAAAMklEQVR42mJgGAWjYBSMgkEJGIlUd+j/WjjbjjGYGC1MtHP10DR6FIyCUTAKBikACDAA0NoDCLGGjH8AAAAASUVORK5CYII=",primary:"#C2FFAE",secondary:"#C2FFAE",stroke:"#000000",strokeWidth:3,innerStroke:null}}; --------------------------------------------------------------------------------