@import "helpers"; @import "fonts/clear-sans.css"; $field-width: 500px; $grid-spacing: 15px; $grid-row-cells: 4; $tile-size: ($field-width - $grid-spacing * ($grid-row-cells + 1)) / $grid-row-cells; $tile-border-radius: 3px; $text-color: #776E65; $bright-text-color: #f9f6f2; $tile-color: #eee4da; $tile-gold-color: #edc22e; $tile-gold-glow-color: lighten($tile-gold-color, 15%); $transition-speed: 100ms; html, body { margin: 0; padding: 0; background: #faf8ef; color: $text-color; font-family: "Clear Sans", "Helvetica Neue", Arial, sans-serif; font-size: 18px; } body { margin: 80px 0; } h1 { font-size: 80px; font-weight: bold; margin: 0; } p { margin-top: 0; margin-bottom: 10px; line-height: 1.65; } a { color: $text-color; font-weight: bold; text-decoration: underline; } strong { &.important { text-transform: uppercase; } } hr { border: none; border-bottom: 1px solid lighten($text-color, 40%); margin-top: 20px; margin-bottom: 30px; } .container { width: $field-width; margin: 0 auto; } .game-container { margin-top: 40px; position: relative; padding: $grid-spacing; cursor: default; -webkit-touch-callout: none; -webkit-user-select: none; -moz-user-select: none; background: #bbada0; border-radius: $tile-border-radius * 2; width: $field-width; height: $field-width; box-sizing: border-box; } .grid-container { position: absolute; z-index: 1; } .grid-row { margin-bottom: $grid-spacing; &:last-child { margin-bottom: 0; } &:after { content: ""; display: block; clear: both; } } .grid-cell { width: $tile-size; height: $tile-size; margin-right: $grid-spacing; float: left; border-radius: $tile-border-radius; background: rgba($tile-color, .35); &:last-child { margin-right: 0; } } .tile-container { position: absolute; z-index: 2; } .tile { background: red; width: $tile-size; height: $tile-size; border-radius: $tile-border-radius; background: $tile-color; text-align: center; line-height: $tile-size + 10px; font-size: 55px; font-weight: bold; @include transition($transition-speed ease-in-out); @include transition-property(top, left); // Build position classes @for $x from 1 through $grid-row-cells { @for $y from 1 through $grid-row-cells { &.tile-position-#{$x}-#{$y} { position: absolute; left: ($tile-size + $grid-spacing) * ($x - 1); top: ($tile-size + $grid-spacing) * ($y - 1); } } } $base: 2; $exponent: 1; $limit: 11; // Colors for all 11 states, false = no special color $special-colors: false false, // 2 false false, // 4 #f78e48 true, // 8 #fc5e2e true, // 16 #ff3333 true, // 32 #ff0000 true, // 64 false true, // 128 false true, // 256 false true, // 512 false true, // 1024 false true; // 2048 // Build tile colors @while $exponent <= $limit { $power: pow($base, $exponent); &.tile-#{$power} { // Calculate base background color $gold-percent: ($exponent - 1) / ($limit - 1) * 100; $mixed-background: mix($tile-gold-color, $tile-color, $gold-percent); $nth-color: nth($special-colors, $exponent); $special-background: nth($nth-color, 1); $bright-color: nth($nth-color, 2); @if $special-background { $mixed-background: mix($special-background, $mixed-background, 55%); } @if $bright-color { color: $bright-text-color; } // Set background background: $mixed-background; // Add glow $glow-opacity: max($exponent - 4, 0) / ($limit - 4); box-shadow: 0 0 30px 10px rgba($tile-gold-glow-color, $glow-opacity / 1.8), inset 0 0 0 1px rgba(white, $glow-opacity / 3); // Adjust font size for bigger numbers @if $power >= 100 and $power < 1000 { font-size: 45px; } @else if $power >= 1000 { font-size: 35px; } } $exponent: $exponent + 1; } } @include keyframes(appear) { 0% { -webkit-transform: scale(1.5); opacity: 0; } 100% { -webkit-transform: scale(1); opacity: 1; } } .tile-new { @include animation(appear 200ms ease $transition-speed); @include animation-fill-mode(both); } .game-intro { margin-bottom: 0; } .game-explanation { margin-top: 50px; }