diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..6b665aaa0c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "liveServer.settings.port": 5501 +} diff --git a/index.html b/index.html index 0da0ee0e1b..6c6ede797a 100644 --- a/index.html +++ b/index.html @@ -1,99 +1,140 @@ - - - 2048 + + + 2048 - - - - - - - + + + - - - - - -
-
-

2048

-
-
0
-
0
-
-
- -
-

Join the numbers and get to the 2048 tile!

- New Game -
+ + + + + + + + -
-
-

-
- Keep going - Try again + + + + + +
+
+

2048

+
+
0
+
0
+ + +
+

+ Join the numbers and get to the 2048 tile! +

+ New Game +
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+

+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-

- How to play: Use your arrow keys to move the tiles. When two tiles with the same number touch, they merge into one! -

-
-

- Note: This site is the official version of 2048. You can play it on your phone via http://git.io/2048. All other apps or sites are derivatives or fakes, and should be used with caution. -

-
-

- Created by Gabriele Cirulli. Based on 1024 by Veewo Studio and conceptually similar to Threes by Asher Vollmer. -

-
+

+ How to play: Use your + arrow keys to move the tiles. When two tiles with the + same number touch, they merge into one! +

+
+

+ Note: This site is the official + version of 2048. You can play it on your phone via + http://git.io/2048. All other apps or + sites are derivatives or fakes, and should be used with caution. +

+
+

+ Created by + Gabriele Cirulli. + Based on + 1024 by Veewo Studio + and conceptually similar to + Threes by Asher Vollmer. +

+
- - - - - - - - - - - + + + + + + + + + + + diff --git a/js/dark-mode-toggle.js b/js/dark-mode-toggle.js new file mode 100644 index 0000000000..0fab3117cd --- /dev/null +++ b/js/dark-mode-toggle.js @@ -0,0 +1,39 @@ +// Add dark mode toggle functionality to the page +document.addEventListener("DOMContentLoaded", function () { + const darkModeToggle = document.getElementById("dark-mode-toggle"); + const darkModeIcon = document.getElementById("dark-mode-icon"); + const darkModeText = document.getElementById("dark-mode-text"); + + // Function to apply dark mode + function applyDarkMode() { + document.documentElement.classList.add("dark-mode"); + document.body.classList.add("dark-mode"); + darkModeIcon.classList.replace("fa-moon", "fa-sun"); + darkModeText.textContent = "Light Mode"; + } + + // Function to apply light mode + function applyLightMode() { + document.documentElement.classList.remove("dark-mode"); + document.body.classList.remove("dark-mode"); + darkModeIcon.classList.replace("fa-sun", "fa-moon"); + darkModeText.textContent = "Dark Mode"; + } + + // Check and apply the current mode from localStorage + const currentMode = localStorage.getItem("darkMode"); + if (currentMode === "enabled") { + applyDarkMode(); + } + + // Toggle dark mode on button click + darkModeToggle.addEventListener("click", function () { + if (document.documentElement.classList.contains("dark-mode")) { + applyLightMode(); + localStorage.setItem("darkMode", "disabled"); + } else { + applyDarkMode(); + localStorage.setItem("darkMode", "enabled"); + } + }); +}); diff --git a/style/main.css b/style/main.css index ea3cb19fca..fb09e6ddec 100644 --- a/style/main.css +++ b/style/main.css @@ -1,56 +1,72 @@ @import url(fonts/clear-sans.css); -html, body { +html, +body { margin: 0; padding: 0; background: #faf8ef; color: #776e65; font-family: "Clear Sans", "Helvetica Neue", Arial, sans-serif; - font-size: 18px; } + font-size: 18px; +} body { - margin: 80px 0; } + margin: 80px 0; +} .heading:after { content: ""; display: block; - clear: both; } + clear: both; +} h1.title { font-size: 80px; font-weight: bold; margin: 0; display: block; - float: left; } + float: left; +} @-webkit-keyframes move-up { 0% { top: 25px; - opacity: 1; } + opacity: 1; + } 100% { top: -50px; - opacity: 0; } } + opacity: 0; + } +} @-moz-keyframes move-up { 0% { top: 25px; - opacity: 1; } + opacity: 1; + } 100% { top: -50px; - opacity: 0; } } + opacity: 0; + } +} @keyframes move-up { 0% { top: 25px; - opacity: 1; } + opacity: 1; + } 100% { top: -50px; - opacity: 0; } } + opacity: 0; + } +} .scores-container { float: right; - text-align: right; } + text-align: right; +} -.score-container, .best-container { +.score-container, +.best-container { position: relative; display: inline-block; background: #bbada0; @@ -62,81 +78,102 @@ h1.title { border-radius: 3px; color: white; margin-top: 8px; - text-align: center; } - .score-container:after, .best-container:after { - position: absolute; - width: 100%; - top: 10px; - left: 0; - text-transform: uppercase; - font-size: 13px; - line-height: 13px; - text-align: center; - color: #eee4da; } - .score-container .score-addition, .best-container .score-addition { - position: absolute; - right: 30px; - color: red; - font-size: 25px; - line-height: 25px; - font-weight: bold; - color: rgba(119, 110, 101, 0.9); - z-index: 100; - -webkit-animation: move-up 600ms ease-in; - -moz-animation: move-up 600ms ease-in; - animation: move-up 600ms ease-in; - -webkit-animation-fill-mode: both; - -moz-animation-fill-mode: both; - animation-fill-mode: both; } + text-align: center; +} +.score-container:after, +.best-container:after { + position: absolute; + width: 100%; + top: 10px; + left: 0; + text-transform: uppercase; + font-size: 13px; + line-height: 13px; + text-align: center; + color: #eee4da; +} +.score-container .score-addition, +.best-container .score-addition { + position: absolute; + right: 30px; + color: red; + font-size: 25px; + line-height: 25px; + font-weight: bold; + color: rgba(119, 110, 101, 0.9); + z-index: 100; + -webkit-animation: move-up 600ms ease-in; + -moz-animation: move-up 600ms ease-in; + animation: move-up 600ms ease-in; + -webkit-animation-fill-mode: both; + -moz-animation-fill-mode: both; + animation-fill-mode: both; +} .score-container:after { - content: "Score"; } + content: "Score"; +} .best-container:after { - content: "Best"; } + content: "Best"; +} p { margin-top: 0; margin-bottom: 10px; - line-height: 1.65; } + line-height: 1.65; +} a { color: #776e65; font-weight: bold; text-decoration: underline; - cursor: pointer; } + cursor: pointer; +} strong.important { - text-transform: uppercase; } + text-transform: uppercase; +} hr { border: none; border-bottom: 1px solid #d8d4d0; margin-top: 20px; - margin-bottom: 30px; } + margin-bottom: 30px; +} .container { width: 500px; - margin: 0 auto; } + margin: 0 auto; +} @-webkit-keyframes fade-in { 0% { - opacity: 0; } + opacity: 0; + } 100% { - opacity: 1; } } + opacity: 1; + } +} @-moz-keyframes fade-in { 0% { - opacity: 0; } + opacity: 0; + } 100% { - opacity: 1; } } + opacity: 1; + } +} @keyframes fade-in { 0% { - opacity: 0; } + opacity: 0; + } 100% { - opacity: 1; } } + opacity: 1; + } +} .game-container { margin-top: 40px; position: relative; @@ -155,64 +192,78 @@ hr { height: 500px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; - box-sizing: border-box; } - .game-container .game-message { - display: none; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: rgba(238, 228, 218, 0.5); - z-index: 100; - text-align: center; - -webkit-animation: fade-in 800ms ease 1200ms; - -moz-animation: fade-in 800ms ease 1200ms; - animation: fade-in 800ms ease 1200ms; - -webkit-animation-fill-mode: both; - -moz-animation-fill-mode: both; - animation-fill-mode: both; } - .game-container .game-message p { - font-size: 60px; - font-weight: bold; - height: 60px; - line-height: 60px; - margin-top: 222px; } - .game-container .game-message .lower { - display: block; - margin-top: 59px; } - .game-container .game-message a { - display: inline-block; - background: #8f7a66; - border-radius: 3px; - padding: 0 20px; - text-decoration: none; - color: #f9f6f2; - height: 40px; - line-height: 42px; - margin-left: 9px; } - .game-container .game-message a.keep-playing-button { - display: none; } - .game-container .game-message.game-won { - background: rgba(237, 194, 46, 0.5); - color: #f9f6f2; } - .game-container .game-message.game-won a.keep-playing-button { - display: inline-block; } - .game-container .game-message.game-won, .game-container .game-message.game-over { - display: block; } + box-sizing: border-box; +} +.game-container .game-message { + display: none; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(238, 228, 218, 0.5); + z-index: 100; + text-align: center; + -webkit-animation: fade-in 800ms ease 1200ms; + -moz-animation: fade-in 800ms ease 1200ms; + animation: fade-in 800ms ease 1200ms; + -webkit-animation-fill-mode: both; + -moz-animation-fill-mode: both; + animation-fill-mode: both; +} +.game-container .game-message p { + font-size: 60px; + font-weight: bold; + height: 60px; + line-height: 60px; + margin-top: 222px; +} +.game-container .game-message .lower { + display: block; + margin-top: 59px; +} +.game-container .game-message a { + display: inline-block; + background: #8f7a66; + border-radius: 3px; + padding: 0 20px; + text-decoration: none; + color: #f9f6f2; + height: 40px; + line-height: 42px; + margin-left: 9px; +} +.game-container .game-message a.keep-playing-button { + display: none; +} +.game-container .game-message.game-won { + background: rgba(237, 194, 46, 0.5); + color: #f9f6f2; +} +.game-container .game-message.game-won a.keep-playing-button { + display: inline-block; +} +.game-container .game-message.game-won, +.game-container .game-message.game-over { + display: block; +} .grid-container { position: absolute; - z-index: 1; } + z-index: 1; +} .grid-row { - margin-bottom: 15px; } - .grid-row:last-child { - margin-bottom: 0; } - .grid-row:after { - content: ""; - display: block; - clear: both; } + margin-bottom: 15px; +} +.grid-row:last-child { + margin-bottom: 0; +} +.grid-row:after { + content: ""; + display: block; + clear: both; +} .grid-cell { width: 106.25px; @@ -220,98 +271,119 @@ hr { margin-right: 15px; float: left; border-radius: 3px; - background: rgba(238, 228, 218, 0.35); } - .grid-cell:last-child { - margin-right: 0; } + background: rgba(238, 228, 218, 0.35); +} +.grid-cell:last-child { + margin-right: 0; +} .tile-container { position: absolute; - z-index: 2; } + z-index: 2; +} -.tile, .tile .tile-inner { +.tile, +.tile .tile-inner { width: 107px; height: 107px; - line-height: 107px; } + line-height: 107px; +} .tile.tile-position-1-1 { -webkit-transform: translate(0px, 0px); -moz-transform: translate(0px, 0px); -ms-transform: translate(0px, 0px); - transform: translate(0px, 0px); } + transform: translate(0px, 0px); +} .tile.tile-position-1-2 { -webkit-transform: translate(0px, 121px); -moz-transform: translate(0px, 121px); -ms-transform: translate(0px, 121px); - transform: translate(0px, 121px); } + transform: translate(0px, 121px); +} .tile.tile-position-1-3 { -webkit-transform: translate(0px, 242px); -moz-transform: translate(0px, 242px); -ms-transform: translate(0px, 242px); - transform: translate(0px, 242px); } + transform: translate(0px, 242px); +} .tile.tile-position-1-4 { -webkit-transform: translate(0px, 363px); -moz-transform: translate(0px, 363px); -ms-transform: translate(0px, 363px); - transform: translate(0px, 363px); } + transform: translate(0px, 363px); +} .tile.tile-position-2-1 { -webkit-transform: translate(121px, 0px); -moz-transform: translate(121px, 0px); -ms-transform: translate(121px, 0px); - transform: translate(121px, 0px); } + transform: translate(121px, 0px); +} .tile.tile-position-2-2 { -webkit-transform: translate(121px, 121px); -moz-transform: translate(121px, 121px); -ms-transform: translate(121px, 121px); - transform: translate(121px, 121px); } + transform: translate(121px, 121px); +} .tile.tile-position-2-3 { -webkit-transform: translate(121px, 242px); -moz-transform: translate(121px, 242px); -ms-transform: translate(121px, 242px); - transform: translate(121px, 242px); } + transform: translate(121px, 242px); +} .tile.tile-position-2-4 { -webkit-transform: translate(121px, 363px); -moz-transform: translate(121px, 363px); -ms-transform: translate(121px, 363px); - transform: translate(121px, 363px); } + transform: translate(121px, 363px); +} .tile.tile-position-3-1 { -webkit-transform: translate(242px, 0px); -moz-transform: translate(242px, 0px); -ms-transform: translate(242px, 0px); - transform: translate(242px, 0px); } + transform: translate(242px, 0px); +} .tile.tile-position-3-2 { -webkit-transform: translate(242px, 121px); -moz-transform: translate(242px, 121px); -ms-transform: translate(242px, 121px); - transform: translate(242px, 121px); } + transform: translate(242px, 121px); +} .tile.tile-position-3-3 { -webkit-transform: translate(242px, 242px); -moz-transform: translate(242px, 242px); -ms-transform: translate(242px, 242px); - transform: translate(242px, 242px); } + transform: translate(242px, 242px); +} .tile.tile-position-3-4 { -webkit-transform: translate(242px, 363px); -moz-transform: translate(242px, 363px); -ms-transform: translate(242px, 363px); - transform: translate(242px, 363px); } + transform: translate(242px, 363px); +} .tile.tile-position-4-1 { -webkit-transform: translate(363px, 0px); -moz-transform: translate(363px, 0px); -ms-transform: translate(363px, 0px); - transform: translate(363px, 0px); } + transform: translate(363px, 0px); +} .tile.tile-position-4-2 { -webkit-transform: translate(363px, 121px); -moz-transform: translate(363px, 121px); -ms-transform: translate(363px, 121px); - transform: translate(363px, 121px); } + transform: translate(363px, 121px); +} .tile.tile-position-4-3 { -webkit-transform: translate(363px, 242px); -moz-transform: translate(363px, 242px); -ms-transform: translate(363px, 242px); - transform: translate(363px, 242px); } + transform: translate(363px, 242px); +} .tile.tile-position-4-4 { -webkit-transform: translate(363px, 363px); -moz-transform: translate(363px, 363px); -ms-transform: translate(363px, 363px); - transform: translate(363px, 363px); } + transform: translate(363px, 363px); +} .tile { position: absolute; @@ -320,79 +392,112 @@ hr { transition: 100ms ease-in-out; -webkit-transition-property: -webkit-transform; -moz-transition-property: -moz-transform; - transition-property: transform; } - .tile .tile-inner { - border-radius: 3px; - background: #eee4da; - text-align: center; - font-weight: bold; - z-index: 10; - font-size: 55px; } - .tile.tile-2 .tile-inner { - background: #eee4da; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0), inset 0 0 0 1px rgba(255, 255, 255, 0); } - .tile.tile-4 .tile-inner { - background: #ede0c8; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0), inset 0 0 0 1px rgba(255, 255, 255, 0); } - .tile.tile-8 .tile-inner { - color: #f9f6f2; - background: #f2b179; } - .tile.tile-16 .tile-inner { - color: #f9f6f2; - background: #f59563; } - .tile.tile-32 .tile-inner { - color: #f9f6f2; - background: #f67c5f; } - .tile.tile-64 .tile-inner { - color: #f9f6f2; - background: #f65e3b; } + transition-property: transform; +} +.tile .tile-inner { + border-radius: 3px; + background: #eee4da; + text-align: center; + font-weight: bold; + z-index: 10; + font-size: 55px; +} +.tile.tile-2 .tile-inner { + background: #eee4da; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0), + inset 0 0 0 1px rgba(255, 255, 255, 0); +} +.tile.tile-4 .tile-inner { + background: #ede0c8; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0), + inset 0 0 0 1px rgba(255, 255, 255, 0); +} +.tile.tile-8 .tile-inner { + color: #f9f6f2; + background: #f2b179; +} +.tile.tile-16 .tile-inner { + color: #f9f6f2; + background: #f59563; +} +.tile.tile-32 .tile-inner { + color: #f9f6f2; + background: #f67c5f; +} +.tile.tile-64 .tile-inner { + color: #f9f6f2; + background: #f65e3b; +} +.tile.tile-128 .tile-inner { + color: #f9f6f2; + background: #edcf72; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.2381), + inset 0 0 0 1px rgba(255, 255, 255, 0.14286); + font-size: 45px; +} +@media screen and (max-width: 520px) { .tile.tile-128 .tile-inner { - color: #f9f6f2; - background: #edcf72; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.2381), inset 0 0 0 1px rgba(255, 255, 255, 0.14286); - font-size: 45px; } - @media screen and (max-width: 520px) { - .tile.tile-128 .tile-inner { - font-size: 25px; } } + font-size: 25px; + } +} +.tile.tile-256 .tile-inner { + color: #f9f6f2; + background: #edcc61; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.31746), + inset 0 0 0 1px rgba(255, 255, 255, 0.19048); + font-size: 45px; +} +@media screen and (max-width: 520px) { .tile.tile-256 .tile-inner { - color: #f9f6f2; - background: #edcc61; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.31746), inset 0 0 0 1px rgba(255, 255, 255, 0.19048); - font-size: 45px; } - @media screen and (max-width: 520px) { - .tile.tile-256 .tile-inner { - font-size: 25px; } } + font-size: 25px; + } +} +.tile.tile-512 .tile-inner { + color: #f9f6f2; + background: #edc850; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.39683), + inset 0 0 0 1px rgba(255, 255, 255, 0.2381); + font-size: 45px; +} +@media screen and (max-width: 520px) { .tile.tile-512 .tile-inner { - color: #f9f6f2; - background: #edc850; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.39683), inset 0 0 0 1px rgba(255, 255, 255, 0.2381); - font-size: 45px; } - @media screen and (max-width: 520px) { - .tile.tile-512 .tile-inner { - font-size: 25px; } } + font-size: 25px; + } +} +.tile.tile-1024 .tile-inner { + color: #f9f6f2; + background: #edc53f; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.47619), + inset 0 0 0 1px rgba(255, 255, 255, 0.28571); + font-size: 35px; +} +@media screen and (max-width: 520px) { .tile.tile-1024 .tile-inner { - color: #f9f6f2; - background: #edc53f; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.47619), inset 0 0 0 1px rgba(255, 255, 255, 0.28571); - font-size: 35px; } - @media screen and (max-width: 520px) { - .tile.tile-1024 .tile-inner { - font-size: 15px; } } + font-size: 15px; + } +} +.tile.tile-2048 .tile-inner { + color: #f9f6f2; + background: #edc22e; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.55556), + inset 0 0 0 1px rgba(255, 255, 255, 0.33333); + font-size: 35px; +} +@media screen and (max-width: 520px) { .tile.tile-2048 .tile-inner { - color: #f9f6f2; - background: #edc22e; - box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.55556), inset 0 0 0 1px rgba(255, 255, 255, 0.33333); - font-size: 35px; } - @media screen and (max-width: 520px) { - .tile.tile-2048 .tile-inner { - font-size: 15px; } } + font-size: 15px; + } +} +.tile.tile-super .tile-inner { + color: #f9f6f2; + background: #3c3a32; + font-size: 30px; +} +@media screen and (max-width: 520px) { .tile.tile-super .tile-inner { - color: #f9f6f2; - background: #3c3a32; - font-size: 30px; } - @media screen and (max-width: 520px) { - .tile.tile-super .tile-inner { - font-size: 10px; } } + font-size: 10px; + } +} @-webkit-keyframes appear { 0% { @@ -400,104 +505,126 @@ hr { -webkit-transform: scale(0); -moz-transform: scale(0); -ms-transform: scale(0); - transform: scale(0); } + transform: scale(0); + } 100% { opacity: 1; -webkit-transform: scale(1); -moz-transform: scale(1); -ms-transform: scale(1); - transform: scale(1); } } + transform: scale(1); + } +} @-moz-keyframes appear { 0% { opacity: 0; -webkit-transform: scale(0); -moz-transform: scale(0); -ms-transform: scale(0); - transform: scale(0); } + transform: scale(0); + } 100% { opacity: 1; -webkit-transform: scale(1); -moz-transform: scale(1); -ms-transform: scale(1); - transform: scale(1); } } + transform: scale(1); + } +} @keyframes appear { 0% { opacity: 0; -webkit-transform: scale(0); -moz-transform: scale(0); -ms-transform: scale(0); - transform: scale(0); } + transform: scale(0); + } 100% { opacity: 1; -webkit-transform: scale(1); -moz-transform: scale(1); -ms-transform: scale(1); - transform: scale(1); } } + transform: scale(1); + } +} .tile-new .tile-inner { -webkit-animation: appear 200ms ease 100ms; -moz-animation: appear 200ms ease 100ms; animation: appear 200ms ease 100ms; -webkit-animation-fill-mode: backwards; -moz-animation-fill-mode: backwards; - animation-fill-mode: backwards; } + animation-fill-mode: backwards; +} @-webkit-keyframes pop { 0% { -webkit-transform: scale(0); -moz-transform: scale(0); -ms-transform: scale(0); - transform: scale(0); } + transform: scale(0); + } 50% { -webkit-transform: scale(1.2); -moz-transform: scale(1.2); -ms-transform: scale(1.2); - transform: scale(1.2); } + transform: scale(1.2); + } 100% { -webkit-transform: scale(1); -moz-transform: scale(1); -ms-transform: scale(1); - transform: scale(1); } } + transform: scale(1); + } +} @-moz-keyframes pop { 0% { -webkit-transform: scale(0); -moz-transform: scale(0); -ms-transform: scale(0); - transform: scale(0); } + transform: scale(0); + } 50% { -webkit-transform: scale(1.2); -moz-transform: scale(1.2); -ms-transform: scale(1.2); - transform: scale(1.2); } + transform: scale(1.2); + } 100% { -webkit-transform: scale(1); -moz-transform: scale(1); -ms-transform: scale(1); - transform: scale(1); } } + transform: scale(1); + } +} @keyframes pop { 0% { -webkit-transform: scale(0); -moz-transform: scale(0); -ms-transform: scale(0); - transform: scale(0); } + transform: scale(0); + } 50% { -webkit-transform: scale(1.2); -moz-transform: scale(1.2); -ms-transform: scale(1.2); - transform: scale(1.2); } + transform: scale(1.2); + } 100% { -webkit-transform: scale(1); -moz-transform: scale(1); -ms-transform: scale(1); - transform: scale(1); } } + transform: scale(1); + } +} .tile-merged .tile-inner { z-index: 20; -webkit-animation: pop 200ms ease 100ms; @@ -505,17 +632,20 @@ hr { animation: pop 200ms ease 100ms; -webkit-animation-fill-mode: backwards; -moz-animation-fill-mode: backwards; - animation-fill-mode: backwards; } + animation-fill-mode: backwards; +} .above-game:after { content: ""; display: block; - clear: both; } + clear: both; +} .game-intro { float: left; line-height: 42px; - margin-bottom: 0; } + margin-bottom: 0; +} .restart-button { display: inline-block; @@ -528,47 +658,59 @@ hr { line-height: 42px; display: block; text-align: center; - float: right; } + float: right; +} .game-explanation { - margin-top: 50px; } + margin-top: 50px; +} @media screen and (max-width: 520px) { - html, body { - font-size: 15px; } + html, + body { + font-size: 15px; + } body { margin: 20px 0; - padding: 0 20px; } + padding: 0 20px; + } h1.title { font-size: 27px; - margin-top: 15px; } + margin-top: 15px; + } .container { width: 280px; - margin: 0 auto; } + margin: 0 auto; + } - .score-container, .best-container { + .score-container, + .best-container { margin-top: 0; padding: 15px 10px; - min-width: 40px; } + min-width: 40px; + } .heading { - margin-bottom: 10px; } + margin-bottom: 10px; + } .game-intro { width: 55%; display: block; box-sizing: border-box; - line-height: 1.65; } + line-height: 1.65; + } .restart-button { width: 42%; padding: 0; display: block; box-sizing: border-box; - margin-top: 2px; } + margin-top: 2px; + } .game-container { margin-top: 17px; @@ -588,64 +730,78 @@ hr { height: 280px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; - box-sizing: border-box; } - .game-container .game-message { - display: none; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: rgba(238, 228, 218, 0.5); - z-index: 100; - text-align: center; - -webkit-animation: fade-in 800ms ease 1200ms; - -moz-animation: fade-in 800ms ease 1200ms; - animation: fade-in 800ms ease 1200ms; - -webkit-animation-fill-mode: both; - -moz-animation-fill-mode: both; - animation-fill-mode: both; } - .game-container .game-message p { - font-size: 60px; - font-weight: bold; - height: 60px; - line-height: 60px; - margin-top: 222px; } - .game-container .game-message .lower { - display: block; - margin-top: 59px; } - .game-container .game-message a { - display: inline-block; - background: #8f7a66; - border-radius: 3px; - padding: 0 20px; - text-decoration: none; - color: #f9f6f2; - height: 40px; - line-height: 42px; - margin-left: 9px; } - .game-container .game-message a.keep-playing-button { - display: none; } - .game-container .game-message.game-won { - background: rgba(237, 194, 46, 0.5); - color: #f9f6f2; } - .game-container .game-message.game-won a.keep-playing-button { - display: inline-block; } - .game-container .game-message.game-won, .game-container .game-message.game-over { - display: block; } + box-sizing: border-box; + } + .game-container .game-message { + display: none; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(238, 228, 218, 0.5); + z-index: 100; + text-align: center; + -webkit-animation: fade-in 800ms ease 1200ms; + -moz-animation: fade-in 800ms ease 1200ms; + animation: fade-in 800ms ease 1200ms; + -webkit-animation-fill-mode: both; + -moz-animation-fill-mode: both; + animation-fill-mode: both; + } + .game-container .game-message p { + font-size: 60px; + font-weight: bold; + height: 60px; + line-height: 60px; + margin-top: 222px; + } + .game-container .game-message .lower { + display: block; + margin-top: 59px; + } + .game-container .game-message a { + display: inline-block; + background: #8f7a66; + border-radius: 3px; + padding: 0 20px; + text-decoration: none; + color: #f9f6f2; + height: 40px; + line-height: 42px; + margin-left: 9px; + } + .game-container .game-message a.keep-playing-button { + display: none; + } + .game-container .game-message.game-won { + background: rgba(237, 194, 46, 0.5); + color: #f9f6f2; + } + .game-container .game-message.game-won a.keep-playing-button { + display: inline-block; + } + .game-container .game-message.game-won, + .game-container .game-message.game-over { + display: block; + } .grid-container { position: absolute; - z-index: 1; } + z-index: 1; + } .grid-row { - margin-bottom: 10px; } - .grid-row:last-child { - margin-bottom: 0; } - .grid-row:after { - content: ""; - display: block; - clear: both; } + margin-bottom: 10px; + } + .grid-row:last-child { + margin-bottom: 0; + } + .grid-row:after { + content: ""; + display: block; + clear: both; + } .grid-cell { width: 57.5px; @@ -653,106 +809,182 @@ hr { margin-right: 10px; float: left; border-radius: 3px; - background: rgba(238, 228, 218, 0.35); } - .grid-cell:last-child { - margin-right: 0; } + background: rgba(238, 228, 218, 0.35); + } + .grid-cell:last-child { + margin-right: 0; + } .tile-container { position: absolute; - z-index: 2; } + z-index: 2; + } - .tile, .tile .tile-inner { + .tile, + .tile .tile-inner { width: 58px; height: 58px; - line-height: 58px; } + line-height: 58px; + } .tile.tile-position-1-1 { -webkit-transform: translate(0px, 0px); -moz-transform: translate(0px, 0px); -ms-transform: translate(0px, 0px); - transform: translate(0px, 0px); } + transform: translate(0px, 0px); + } .tile.tile-position-1-2 { -webkit-transform: translate(0px, 67px); -moz-transform: translate(0px, 67px); -ms-transform: translate(0px, 67px); - transform: translate(0px, 67px); } + transform: translate(0px, 67px); + } .tile.tile-position-1-3 { -webkit-transform: translate(0px, 135px); -moz-transform: translate(0px, 135px); -ms-transform: translate(0px, 135px); - transform: translate(0px, 135px); } + transform: translate(0px, 135px); + } .tile.tile-position-1-4 { -webkit-transform: translate(0px, 202px); -moz-transform: translate(0px, 202px); -ms-transform: translate(0px, 202px); - transform: translate(0px, 202px); } + transform: translate(0px, 202px); + } .tile.tile-position-2-1 { -webkit-transform: translate(67px, 0px); -moz-transform: translate(67px, 0px); -ms-transform: translate(67px, 0px); - transform: translate(67px, 0px); } + transform: translate(67px, 0px); + } .tile.tile-position-2-2 { -webkit-transform: translate(67px, 67px); -moz-transform: translate(67px, 67px); -ms-transform: translate(67px, 67px); - transform: translate(67px, 67px); } + transform: translate(67px, 67px); + } .tile.tile-position-2-3 { -webkit-transform: translate(67px, 135px); -moz-transform: translate(67px, 135px); -ms-transform: translate(67px, 135px); - transform: translate(67px, 135px); } + transform: translate(67px, 135px); + } .tile.tile-position-2-4 { -webkit-transform: translate(67px, 202px); -moz-transform: translate(67px, 202px); -ms-transform: translate(67px, 202px); - transform: translate(67px, 202px); } + transform: translate(67px, 202px); + } .tile.tile-position-3-1 { -webkit-transform: translate(135px, 0px); -moz-transform: translate(135px, 0px); -ms-transform: translate(135px, 0px); - transform: translate(135px, 0px); } + transform: translate(135px, 0px); + } .tile.tile-position-3-2 { -webkit-transform: translate(135px, 67px); -moz-transform: translate(135px, 67px); -ms-transform: translate(135px, 67px); - transform: translate(135px, 67px); } + transform: translate(135px, 67px); + } .tile.tile-position-3-3 { -webkit-transform: translate(135px, 135px); -moz-transform: translate(135px, 135px); -ms-transform: translate(135px, 135px); - transform: translate(135px, 135px); } + transform: translate(135px, 135px); + } .tile.tile-position-3-4 { -webkit-transform: translate(135px, 202px); -moz-transform: translate(135px, 202px); -ms-transform: translate(135px, 202px); - transform: translate(135px, 202px); } + transform: translate(135px, 202px); + } .tile.tile-position-4-1 { -webkit-transform: translate(202px, 0px); -moz-transform: translate(202px, 0px); -ms-transform: translate(202px, 0px); - transform: translate(202px, 0px); } + transform: translate(202px, 0px); + } .tile.tile-position-4-2 { -webkit-transform: translate(202px, 67px); -moz-transform: translate(202px, 67px); -ms-transform: translate(202px, 67px); - transform: translate(202px, 67px); } + transform: translate(202px, 67px); + } .tile.tile-position-4-3 { -webkit-transform: translate(202px, 135px); -moz-transform: translate(202px, 135px); -ms-transform: translate(202px, 135px); - transform: translate(202px, 135px); } + transform: translate(202px, 135px); + } .tile.tile-position-4-4 { -webkit-transform: translate(202px, 202px); -moz-transform: translate(202px, 202px); -ms-transform: translate(202px, 202px); - transform: translate(202px, 202px); } + transform: translate(202px, 202px); + } .tile .tile-inner { - font-size: 35px; } + font-size: 35px; + } .game-message p { font-size: 30px !important; height: 30px !important; line-height: 30px !important; - margin-top: 90px !important; } + margin-top: 90px !important; + } .game-message .lower { - margin-top: 30px !important; } } + margin-top: 30px !important; + } +} + +/* Dark Mode styles */ +:root { + --dark-bg: #333; + --dark-text: #fff; + --dark-container-bg: #444; + --dark-score-bg: #bbada0; + --dark-tile-bg: #8f7a66; + --dark-tile-text: #776e65; + --toggle-bg: #8f7a66; + --toggle-hover-bg: #9c8b81; +} + +/* Dark Mode Toggle Button */ +#dark-mode-toggle { + margin-top: 20px; + padding: 10px 15px; + background-color: var(--toggle-bg); + color: var(--dark-text); + border: none; + border-radius: 3px; + cursor: pointer; + font-size: 18px; + outline: none; +} + +#dark-mode-toggle:hover { + background-color: var(--toggle-hover-bg); +} + +/* Dark Mode Applied to Page */ +body.dark-mode, +html.dark-mode { + background-color: var(--dark-bg); + color: var(--dark-text); +} + +body.dark-mode .container { + background-color: var(--dark-container-bg); +} + +body.dark-mode .score-container, +body.dark-mode .best-container { + background-color: var(--dark-score-bg); + color: var(--dark-text); +} + +body.dark-mode .tile { + background-color: var(--dark-tile-bg); + color: var(--dark-tile-text); /* Consistent with light mode */ +} diff --git a/style/main.scss b/style/main.scss index b0ec8da9cc..6b6d7a133d 100644 --- a/style/main.scss +++ b/style/main.scss @@ -4,12 +4,13 @@ $field-width: 500px; $grid-spacing: 15px; $grid-row-cells: 4; -$tile-size: ($field-width - $grid-spacing * ($grid-row-cells + 1)) / $grid-row-cells; +$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; +$text-color: #776e65; $bright-text-color: #f9f6f2; $tile-color: #eee4da; @@ -21,7 +22,8 @@ $game-container-background: #bbada0; $transition-speed: 100ms; -html, body { +html, +body { margin: 0; padding: 0; @@ -64,7 +66,8 @@ h1.title { text-align: right; } -.score-container, .best-container { +.score-container, +.best-container { $height: 25px; position: relative; @@ -99,7 +102,7 @@ h1.title { font-size: $height; line-height: $height; font-weight: bold; - color: rgba($text-color, .9); + color: rgba($text-color, 0.9); z-index: 100; @include animation(move-up 600ms ease-in); @include animation-fill-mode(both); @@ -201,7 +204,7 @@ hr { right: 0; bottom: 0; left: 0; - background: rgba($tile-color, .5); + background: rgba($tile-color, 0.5); z-index: 100; text-align: center; @@ -226,24 +229,25 @@ hr { margin-left: 9px; // margin-top: 59px; - &.keep-playing-button { - display: none; - } + &.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); + background: rgba($tile-gold-color, 0.5); color: $bright-text-color; - a.keep-playing-button { - display: inline-block; - } + a.keep-playing-button { + display: inline-block; + } } - &.game-won, &.game-over { + &.game-won, + &.game-over { display: block; } } @@ -276,7 +280,7 @@ hr { border-radius: $tile-border-radius; - background: rgba($tile-color, .35); + background: rgba($tile-color, 0.35); &:last-child { margin-right: 0; @@ -289,7 +293,8 @@ hr { } .tile { - &, .tile-inner { + &, + .tile-inner { width: ceil($tile-size); height: ceil($tile-size); line-height: ceil($tile-size); @@ -336,17 +341,27 @@ hr { $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 + $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 { @@ -377,8 +392,12 @@ hr { $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); + 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 @@ -477,11 +496,13 @@ hr { $field-width: 280px; $grid-spacing: 10px; $grid-row-cells: 4; - $tile-size: ($field-width - $grid-spacing * ($grid-row-cells + 1)) / $grid-row-cells; + $tile-size: ($field-width - $grid-spacing * ($grid-row-cells + 1)) / + $grid-row-cells; $tile-border-radius: 3px; $game-container-margin-top: 17px; - html, body { + html, + body { font-size: 15px; } @@ -500,7 +521,8 @@ hr { margin: 0 auto; } - .score-container, .best-container { + .score-container, + .best-container { margin-top: 0; padding: 15px 10px; min-width: 40px;