123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550 |
- @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;
- $mobile-threshold: $field-width + 20px;
- $text-color: #776E65;
- $bright-text-color: #f9f6f2;
- $tile-color: #eee4da;
- $tile-gold-color: #edc22e;
- $tile-gold-glow-color: lighten($tile-gold-color, 15%);
- $game-container-margin-top: 40px;
- $game-container-background: #bbada0;
- $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;
- }
- .heading {
- @include clearfix;
- }
- h1.title {
- font-size: 80px;
- font-weight: bold;
- margin: 0;
- display: block;
- float: left;
- }
- @include keyframes(move-up) {
- 0% {
- top: 25px;
- opacity: 1;
- }
- 100% {
- top: -50px;
- opacity: 0;
- }
- }
- .scores-container {
- float: right;
- text-align: right;
- }
- .score-container, .best-container {
- $height: 25px;
- position: relative;
- display: inline-block;
- background: $game-container-background;
- padding: 15px 25px;
- font-size: $height;
- height: $height;
- line-height: $height + 22px;
- font-weight: bold;
- border-radius: 3px;
- color: white;
- margin-top: 8px;
- text-align: center;
- &:after {
- position: absolute;
- width: 100%;
- top: 10px;
- left: 0;
- text-transform: uppercase;
- font-size: 13px;
- line-height: 13px;
- text-align: center;
- color: $tile-color;
- }
- .score-addition {
- position: absolute;
- right: 30px;
- color: red;
- font-size: $height;
- line-height: $height;
- font-weight: bold;
- color: rgba($text-color, .9);
- z-index: 100;
- @include animation(move-up 600ms ease-in);
- @include animation-fill-mode(both);
- }
- }
- .score-container:after {
- content: "Score";
- }
- .best-container:after {
- content: "Best"
- }
- p {
- margin-top: 0;
- margin-bottom: 10px;
- line-height: 1.65;
- }
- a {
- color: $text-color;
- font-weight: bold;
- text-decoration: underline;
- cursor: pointer;
- }
- 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;
- }
- @include keyframes(fade-in) {
- 0% {
- opacity: 0;
- }
- 100% {
- opacity: 1;
- }
- }
- // Styles for buttons
- @mixin button {
- display: inline-block;
- background: darken($game-container-background, 20%);
- border-radius: 3px;
- padding: 0 20px;
- text-decoration: none;
- color: $bright-text-color;
- height: 40px;
- line-height: 42px;
- }
- // Game field mixin used to render CSS at different width
- @mixin game-field {
- .game-container {
- margin-top: $game-container-margin-top;
- position: relative;
- padding: $grid-spacing;
- cursor: default;
- -webkit-touch-callout: none;
- -ms-touch-callout: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- -ms-touch-action: none;
- touch-action: none;
- background: $game-container-background;
- border-radius: $tile-border-radius * 2;
- width: $field-width;
- height: $field-width;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- .game-message {
- display: none;
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background: rgba($tile-color, .5);
- z-index: 100;
- text-align: center;
- p {
- font-size: 60px;
- font-weight: bold;
- height: 60px;
- line-height: 60px;
- margin-top: 222px;
- // height: $field-width;
- // line-height: $field-width;
- }
- .lower {
- display: block;
- margin-top: 59px;
- }
- a {
- @include button;
- margin-left: 9px;
- // margin-top: 59px;
- &.keep-playing-button {
- display: none;
- }
- }
- @include animation(fade-in 800ms ease $transition-speed * 12);
- @include animation-fill-mode(both);
- &.game-won {
- background: rgba($tile-gold-color, .5);
- color: $bright-text-color;
- a.keep-playing-button {
- display: inline-block;
- }
- }
- &.game-won, &.game-over {
- display: block;
- }
- }
- }
- .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 {
- &, .tile-inner {
- width: ceil($tile-size);
- height: ceil($tile-size);
- line-height: $tile-size + 10px;
- }
- // Build position classes
- @for $x from 1 through $grid-row-cells {
- @for $y from 1 through $grid-row-cells {
- &.tile-position-#{$x}-#{$y} {
- $xPos: floor(($tile-size + $grid-spacing) * ($x - 1));
- $yPos: floor(($tile-size + $grid-spacing) * ($y - 1));
- @include transform(translate($xPos, $yPos));
- }
- }
- }
- }
- }
- // End of game-field mixin
- @include game-field;
- .tile {
- position: absolute; // Makes transforms relative to the top-left corner
- .tile-inner {
- border-radius: $tile-border-radius;
- background: $tile-color;
- text-align: center;
- font-weight: bold;
- z-index: 10;
- font-size: 55px;
- }
- // Movement transition
- @include transition($transition-speed ease-in-out);
- -webkit-transition-property: -webkit-transform;
- -moz-transition-property: -moz-transform;
- transition-property: transform;
- $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} .tile-inner {
- // 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);
- @if not $special-background {
- 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;
- // Media queries placed here to avoid carrying over the rest of the logic
- @include smaller($mobile-threshold) {
- font-size: 25px;
- }
- } @else if $power >= 1000 {
- font-size: 35px;
- @include smaller($mobile-threshold) {
- font-size: 15px;
- }
- }
- }
- $exponent: $exponent + 1;
- }
- // Super tiles (above 2048)
- &.tile-super .tile-inner {
- color: $bright-text-color;
- background: mix(#333, $tile-gold-color, 95%);
- font-size: 30px;
- @include smaller($mobile-threshold) {
- font-size: 10px;
- }
- }
- }
- @include keyframes(appear) {
- 0% {
- opacity: 0;
- @include transform(scale(0));
- }
- 100% {
- opacity: 1;
- @include transform(scale(1));
- }
- }
- .tile-new .tile-inner {
- @include animation(appear 200ms ease $transition-speed);
- @include animation-fill-mode(backwards);
- }
- @include keyframes(pop) {
- 0% {
- @include transform(scale(0));
- }
- 50% {
- @include transform(scale(1.2));
- }
- 100% {
- @include transform(scale(1));
- }
- }
- .tile-merged .tile-inner {
- z-index: 20;
- @include animation(pop 200ms ease $transition-speed);
- @include animation-fill-mode(backwards);
- }
- .above-game {
- @include clearfix;
- }
- .game-intro {
- float: left;
- line-height: 42px;
- margin-bottom: 0;
- }
- .restart-button {
- @include button;
- display: block;
- text-align: center;
- float: right;
- }
- .game-explanation {
- margin-top: 50px;
- }
- @include smaller($mobile-threshold) {
- // Redefine variables for smaller screens
- $field-width: 280px;
- $grid-spacing: 10px;
- $grid-row-cells: 4;
- $tile-size: ($field-width - $grid-spacing * ($grid-row-cells + 1)) / $grid-row-cells;
- $tile-border-radius: 3px;
- $game-container-margin-top: 17px;
- html, body {
- font-size: 15px;
- }
- body {
- margin: 20px 0;
- padding: 0 20px;
- }
- h1.title {
- font-size: 27px;
- margin-top: 15px;
- }
- .container {
- width: $field-width;
- margin: 0 auto;
- }
- .score-container, .best-container {
- margin-top: 0;
- padding: 15px 10px;
- min-width: 40px;
- }
- .heading {
- margin-bottom: 10px;
- }
- // Show intro and restart button side by side
- .game-intro {
- width: 55%;
- display: block;
- box-sizing: border-box;
- line-height: 1.65;
- }
- .restart-button {
- width: 42%;
- padding: 0;
- display: block;
- box-sizing: border-box;
- margin-top: 2px;
- }
- // Render the game field at the right width
- @include game-field;
- // Rest of the font-size adjustments in the tile class
- .tile .tile-inner {
- font-size: 35px;
- }
- .game-message {
- p {
- font-size: 30px !important;
- height: 30px !important;
- line-height: 30px !important;
- margin-top: 90px !important;
- }
- .lower {
- margin-top: 30px !important;
- }
- }
- }
|