diff --git a/scripts/backup b/scripts/backup
index 99f4abc..80e4cd6 100644
--- a/scripts/backup
+++ b/scripts/backup
@@ -12,19 +12,23 @@ source /usr/share/yunohost/helpers
# MANAGE SCRIPT FAILURE
#=================================================
-# Exit if an error occurs during the execution of the script
ynh_abort_if_errors
#=================================================
# LOAD SETTINGS
#=================================================
-ynh_print_info --message="Backing up 243..."
+ynh_print_info --message="Loading installation settings..."
app=$YNH_APP_INSTANCE_NAME
final_path=$(ynh_app_setting_get --app=$app --key=final_path)
domain=$(ynh_app_setting_get --app=$app --key=domain)
+#=================================================
+# DECLARE DATA AND CONF FILES TO BACKUP
+#=================================================
+ynh_print_info --message="Declaring files to be backed up..."
+
#=================================================
# BACKUP THE APP MAIN DIR
#=================================================
diff --git a/scripts/change_url b/scripts/change_url
index cfd532b..e912667 100644
--- a/scripts/change_url
+++ b/scripts/change_url
@@ -8,7 +8,6 @@
source /usr/share/yunohost/helpers
-# Stop script if errors
ynh_abort_if_errors
#=================================================
diff --git a/scripts/install b/scripts/install
index 66cfb29..7decae6 100755
--- a/scripts/install
+++ b/scripts/install
@@ -12,7 +12,6 @@ source /usr/share/yunohost/helpers
# MANAGE SCRIPT FAILURE
#=================================================
-# Exit if an error occurs during the execution of the script
ynh_abort_if_errors
#=================================================
diff --git a/scripts/restore b/scripts/restore
index c2896b5..7680bdd 100644
--- a/scripts/restore
+++ b/scripts/restore
@@ -12,7 +12,6 @@ source /usr/share/yunohost/helpers
# MANAGE SCRIPT FAILURE
#=================================================
-# Exit if an error occurs during the execution of the script
ynh_abort_if_errors
#=================================================
diff --git a/sources/CONTRIBUTING.md b/sources/CONTRIBUTING.md
deleted file mode 100644
index 968baa9..0000000
--- a/sources/CONTRIBUTING.md
+++ /dev/null
@@ -1,2 +0,0 @@
-## Contributing
-Changes and improvements are more than welcome! Feel free to fork and open a pull request. Please make your changes in a specifically made branch and request to pull on `master`! If you can, please make sure the game fully works before sending the PR, as that will help speed up the process.
diff --git a/sources/LICENSE.txt b/sources/LICENSE.txt
deleted file mode 100644
index b0dbfa4..0000000
--- a/sources/LICENSE.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Gabriele Cirulli
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/sources/README.md b/sources/README.md
deleted file mode 100644
index 96a85a7..0000000
--- a/sources/README.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# 2048
-A small clone of [1024](https://play.google.com/store/apps/details?id=com.veewo.a1024), based on [Saming's 2048](http://saming.fr/p/2048/) (also a clone).
-
-Made just for fun. [Play it here!](http://gabrielecirulli.github.io/2048/)
-
-### Contributions
-
- - [TimPetricola](https://github.com/TimPetricola) added best score storage
- - [chrisprice](https://github.com/chrisprice) added custom code for swipe handling on mobile
- - [elektryk](https://github.com/elektryk) made swipes work on Windows Phone
-
-Many thanks to [rayhaanj](https://github.com/rayhaanj), [Mechazawa](https://github.com/Mechazawa), [grant](https://github.com/grant), [remram44](https://github.com/remram44) and [ghoullier](https://github.com/ghoullier) for the many other good contributions.
-
-### Screenshot
-
-[](http://pictures.gabrielecirulli.com/2048-20140309-234100.png)
-
-That screenshot is fake, by the way. I never reached 2048 :smile:
-
-## Contributing
-Changes and improvements are more than welcome! Feel free to fork and open a pull request. Please make your changes in a specific branch and request to pull into `master`! If you can, please make sure the game fully works before sending the PR, as that will help speed up the process.
-
-You can find the same information in the [contributing guide.](https://github.com/gabrielecirulli/2048/blob/master/CONTRIBUTING.md)
-
-## License
-2048 is licensed under the [MIT license.](https://github.com/gabrielecirulli/2048/blob/master/LICENSE.txt)
-
-## Donations
-I made this in my spare time, and it's hosted on GitHub (which means I don't have any hosting costs), but if you enjoyed the game and feel like buying me coffee, you can donate at my BTC address: `1Ec6onfsQmoP9kkL3zkpB6c5sA4PVcXU2i`. Thank you very much!
diff --git a/sources/Rakefile b/sources/Rakefile
deleted file mode 100644
index 673b273..0000000
--- a/sources/Rakefile
+++ /dev/null
@@ -1,11 +0,0 @@
-require "date"
-
-namespace :appcache do
- desc "update the date in the appcache file (in the gh-pages branch)"
- task :update do
- appcache = File.read("cache.appcache")
- updated = "# Updated: #{DateTime.now}\n"
-
- File.write("cache.appcache", appcache.sub(/\A(#.*$\n)?/, updated))
- end
-end
diff --git a/sources/favicon.ico b/sources/favicon.ico
deleted file mode 100644
index 22109e0..0000000
Binary files a/sources/favicon.ico and /dev/null differ
diff --git a/sources/index.html b/sources/index.html
deleted file mode 100644
index fd18813..0000000
--- a/sources/index.html
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
- 243
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Join the numbers and get to the 243 tile!
-
-
-
-
- How to play: Use your arrow keys to move the tiles. When three tiles with the same number touch, they merge into one!
-
-
-
- Note: This site is NOT the official version of 2048.
-
-
- The original 2048 was created by Gabriele Cirulli. Based on 1024 by Veewo Studio and conceptually similar to Threes by Asher Vollmer.
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/sources/js/animframe_polyfill.js b/sources/js/animframe_polyfill.js
deleted file mode 100644
index c45a13e..0000000
--- a/sources/js/animframe_polyfill.js
+++ /dev/null
@@ -1,26 +0,0 @@
-(function() {
- var lastTime = 0;
- var vendors = ['webkit', 'moz'];
- for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
- window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
- window.cancelAnimationFrame =
- window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];
- }
-
- if (!window.requestAnimationFrame) {
- window.requestAnimationFrame = function(callback, element) {
- var currTime = new Date().getTime();
- var timeToCall = Math.max(0, 16 - (currTime - lastTime));
- var id = window.setTimeout(function() { callback(currTime + timeToCall); },
- timeToCall);
- lastTime = currTime + timeToCall;
- return id;
- };
- }
-
- if (!window.cancelAnimationFrame) {
- window.cancelAnimationFrame = function(id) {
- clearTimeout(id);
- };
- }
-}());
diff --git a/sources/js/application.js b/sources/js/application.js
deleted file mode 100644
index b5ee5f1..0000000
--- a/sources/js/application.js
+++ /dev/null
@@ -1,4 +0,0 @@
-// Wait till the browser is ready to render the game (avoids glitches)
-window.requestAnimationFrame(function () {
- new GameManager(5, KeyboardInputManager, HTMLActuator, LocalScoreManager);
-});
diff --git a/sources/js/game_manager.js b/sources/js/game_manager.js
deleted file mode 100644
index 98c6f36..0000000
--- a/sources/js/game_manager.js
+++ /dev/null
@@ -1,267 +0,0 @@
-function GameManager(size, InputManager, Actuator, ScoreManager) {
- this.size = size; // Size of the grid
- this.inputManager = new InputManager;
- this.scoreManager = new ScoreManager;
- this.actuator = new Actuator;
-
- this.startTiles = 2;
-
- this.inputManager.on("move", this.move.bind(this));
- this.inputManager.on("restart", this.restart.bind(this));
- this.inputManager.on("keepPlaying", this.keepPlaying.bind(this));
-
- this.setup();
-}
-
-// Restart the game
-GameManager.prototype.restart = function () {
- this.actuator.continue();
- this.setup();
-};
-
-// Keep playing after winning
-GameManager.prototype.keepPlaying = function () {
- this.keepPlaying = true;
- this.actuator.continue();
-};
-
-GameManager.prototype.isGameTerminated = function () {
- if (this.over || (this.won && !this.keepPlaying)) {
- return true;
- } else {
- return false;
- }
-};
-
-// Set up the game
-GameManager.prototype.setup = function () {
- this.grid = new Grid(this.size);
-
- this.score = 0;
- this.over = false;
- this.won = false;
- this.keepPlaying = false;
-
- // Add the initial tiles
- this.addStartTiles();
-
- // Update the actuator
- this.actuate();
-};
-
-// Set up the initial tiles to start the game with
-GameManager.prototype.addStartTiles = function () {
- for (var i = 0; i < this.startTiles; i++) {
- this.addRandomTile();
- }
-};
-
-// Adds a tile in a random position
-GameManager.prototype.addRandomTile = function () {
- if (this.grid.cellsAvailable()) {
- var value = Math.random() < 0.9 ? 1 : 3;
- var tile = new Tile(this.grid.randomAvailableCell(), value);
-
- this.grid.insertTile(tile);
- }
-};
-
-// Sends the updated grid to the actuator
-GameManager.prototype.actuate = function () {
- if (this.scoreManager.get() < this.score) {
- this.scoreManager.set(this.score);
- }
-
- this.actuator.actuate(this.grid, {
- score: this.score,
- over: this.over,
- won: this.won,
- bestScore: this.scoreManager.get(),
- terminated: this.isGameTerminated()
- });
-
-};
-
-// Save all tile positions and remove merger info
-GameManager.prototype.prepareTiles = function () {
- this.grid.eachCell(function (x, y, tile) {
- if (tile) {
- tile.mergedFrom = null;
- tile.savePosition();
- }
- });
-};
-
-// Move a tile and its representation
-GameManager.prototype.moveTile = function (tile, cell) {
- this.grid.cells[tile.x][tile.y] = null;
- this.grid.cells[cell.x][cell.y] = tile;
- tile.updatePosition(cell);
-};
-
-// Move tiles on the grid in the specified direction
-GameManager.prototype.move = function (direction) {
- // 0: up, 1: right, 2:down, 3: left
- var self = this;
-
- if (this.isGameTerminated()) return; // Don't do anything if the game's over
-
- var cell, tile;
-
- var vector = this.getVector(direction);
- var traversals = this.buildTraversals(vector);
- var moved = false;
-
- // Save the current tile positions and remove merger information
- this.prepareTiles();
-
- // Traverse the grid in the right direction and move tiles
- traversals.x.forEach(function (x) {
- traversals.y.forEach(function (y) {
- cell = { x: x, y: y };
- tile = self.grid.cellContent(cell);
-
- if(tile && tile.merged) {
- self.grid.removeTile(tile);
- }
- else if (tile) {
- var positions = self.findFarthestPosition(cell, vector);
- var next = self.grid.cellContent(positions.next);
- var pos2 = null;
- var next2 = null;
- if(next)
- {
- pos2 = self.findFarthestPosition({x: next.x, y: next.y}, vector);
- next2 = self.grid.cellContent(pos2.next);
- }
- // Only one merger per row traversal?
- if (next && next.value === tile.value && next2 && next2.value === tile.value && !next.mergedFrom && next != next2) {
- var merged = new Tile(pos2.next, tile.value * 3);
- merged.mergedFrom = [next2, next, tile];
- tile.merged = true;
- next.merged = true;
- next2.merged = true;
-
- self.grid.removeTile(tile);
- self.grid.removeTile(next);
- self.grid.removeTile(next2);
-
- self.grid.insertTile(merged);
- // Converge the two tiles' positions
- tile.updatePosition(pos2.next);
- next.updatePosition(pos2.next);
- // Update the score
- self.score += merged.value;
-
- // The mighty 2048 tile
- if (merged.value === 243) self.won = true;
- }
-
- else if (!tile.merged){
- self.moveTile(tile, positions.farthest);
- }
-
- if (tile && !self.positionsEqual(cell, tile)) {
- moved = true; // The tile moved from its original cell!
- }
- }
-
- });
- });
-
- if (moved) {
- this.addRandomTile();
-
- if (!this.movesAvailable()) {
- this.over = true; // Game over!
- }
-
- this.actuate();
- }
-};
-
-// Get the vector representing the chosen direction
-GameManager.prototype.getVector = function (direction) {
- // Vectors representing tile movement
- var map = {
- 0: { x: 0, y: -1 }, // up
- 1: { x: 1, y: 0 }, // right
- 2: { x: 0, y: 1 }, // down
- 3: { x: -1, y: 0 } // left
- };
-
- return map[direction];
-};
-
-// Build a list of positions to traverse in the right order
-GameManager.prototype.buildTraversals = function (vector) {
- var traversals = { x: [], y: [] };
-
- for (var pos = 0; pos < this.size; pos++) {
- traversals.x.push(pos);
- traversals.y.push(pos);
- }
-
- // Always traverse from the farthest cell in the chosen direction
- if (vector.x === 1) traversals.x = traversals.x.reverse();
- if (vector.y === 1) traversals.y = traversals.y.reverse();
-
- return traversals;
-};
-
-GameManager.prototype.findFarthestPosition = function (cell, vector) {
- var previous;
-
- // Progress towards the vector direction until an obstacle is found
- do {
- previous = cell;
- cell = { x: previous.x + vector.x, y: previous.y + vector.y };
- } while (this.grid.withinBounds(cell) &&
- this.grid.cellAvailable(cell));
-
- return {
- farthest: previous,
- next: cell // Used to check if a merge is required
- };
-};
-
-GameManager.prototype.movesAvailable = function () {
- return this.grid.cellsAvailable() || this.tileMatchesAvailable();
-};
-
-// Check for available matches between tiles (more expensive check)
-GameManager.prototype.tileMatchesAvailable = function () {
- var self = this;
-
- var tile;
- var i = 0;
- while(i < 4){
- for (var x = 0; x < this.size; x++) {
- for (var y = 0; y < this.size; y++) {
- var vector = this.getVector(i);
- tile = this.grid.cellContent({ x: x, y: y });
-
- cell = { x: x, y: y };
- tile = self.grid.cellContent(cell);
-
- if (tile) {
- var positions = self.findFarthestPosition(cell, vector);
- var next = self.grid.cellContent(positions.next);
- var pos2 = self.findFarthestPosition({x: cell.x + vector.x, y: cell.y + vector.y}, vector);
- var next2 = self.grid.cellContent(pos2.next);
- // Only one merger per row traversal?
- if (next && next.value === tile.value && next2 && next2.value === tile.value && !next.mergedFrom && next != next2) {
- return true;
- }
- }
- }
- }
- i += 1;
- }
-
- return false;
-};
-
-GameManager.prototype.positionsEqual = function (first, second) {
- return first.x === second.x && first.y === second.y;
-};
diff --git a/sources/js/grid.js b/sources/js/grid.js
deleted file mode 100644
index 73b86a2..0000000
--- a/sources/js/grid.js
+++ /dev/null
@@ -1,84 +0,0 @@
-function Grid(size) {
- this.size = size;
-
- this.cells = [];
-
- this.build();
-}
-
-// Build a grid of the specified size
-Grid.prototype.build = function () {
- for (var x = 0; x < this.size; x++) {
- var row = this.cells[x] = [];
-
- for (var y = 0; y < this.size; y++) {
- row.push(null);
- }
- }
-};
-
-// Find the first available random position
-Grid.prototype.randomAvailableCell = function () {
- var cells = this.availableCells();
-
- if (cells.length) {
- return cells[Math.floor(Math.random() * cells.length)];
- }
-};
-
-Grid.prototype.availableCells = function () {
- var cells = [];
-
- this.eachCell(function (x, y, tile) {
- if (!tile) {
- cells.push({ x: x, y: y });
- }
- });
-
- return cells;
-};
-
-// Call callback for every cell
-Grid.prototype.eachCell = function (callback) {
- for (var x = 0; x < this.size; x++) {
- for (var y = 0; y < this.size; y++) {
- callback(x, y, this.cells[x][y]);
- }
- }
-};
-
-// Check if there are any cells available
-Grid.prototype.cellsAvailable = function () {
- return !!this.availableCells().length;
-};
-
-// Check if the specified cell is taken
-Grid.prototype.cellAvailable = function (cell) {
- return !this.cellOccupied(cell);
-};
-
-Grid.prototype.cellOccupied = function (cell) {
- return !!this.cellContent(cell);
-};
-
-Grid.prototype.cellContent = function (cell) {
- if (this.withinBounds(cell)) {
- return this.cells[cell.x][cell.y];
- } else {
- return null;
- }
-};
-
-// Inserts a tile at its position
-Grid.prototype.insertTile = function (tile) {
- this.cells[tile.x][tile.y] = tile;
-};
-
-Grid.prototype.removeTile = function (tile) {
- this.cells[tile.x][tile.y] = null;
-};
-
-Grid.prototype.withinBounds = function (position) {
- return position && position.x >= 0 && position.x < this.size &&
- position.y >= 0 && position.y < this.size;
-};
diff --git a/sources/js/html_actuator.js b/sources/js/html_actuator.js
deleted file mode 100644
index d840068..0000000
--- a/sources/js/html_actuator.js
+++ /dev/null
@@ -1,139 +0,0 @@
-function HTMLActuator() {
- this.tileContainer = document.querySelector(".tile-container");
- this.scoreContainer = document.querySelector(".score-container");
- this.bestContainer = document.querySelector(".best-container");
- this.messageContainer = document.querySelector(".game-message");
-
- this.score = 0;
-}
-
-HTMLActuator.prototype.actuate = function (grid, metadata) {
- var self = this;
-
- window.requestAnimationFrame(function () {
- self.clearContainer(self.tileContainer);
-
- grid.cells.forEach(function (column) {
- column.forEach(function (cell) {
- if (cell) {
- self.addTile(cell);
- }
- });
- });
-
- self.updateScore(metadata.score);
- self.updateBestScore(metadata.bestScore);
-
- if (metadata.terminated) {
- if (metadata.over) {
- self.message(false); // You lose
- } else if (metadata.won) {
- self.message(true); // You win!
- }
- }
-
- });
-};
-
-// Continues the game (both restart and keep playing)
-HTMLActuator.prototype.continue = function () {
- this.clearMessage();
-};
-
-HTMLActuator.prototype.clearContainer = function (container) {
- while (container.firstChild) {
- container.removeChild(container.firstChild);
- }
-};
-
-HTMLActuator.prototype.addTile = function (tile) {
- var self = this;
-
- var wrapper = document.createElement("div");
- var inner = document.createElement("div");
- var position = tile.previousPosition || { x: tile.x, y: tile.y };
- var positionClass = this.positionClass(position);
-
- // We can't use classlist because it somehow glitches when replacing classes
- var classes = ["tile", "tile-" + tile.value, positionClass];
-
- if (tile.value > 2048) classes.push("tile-super");
-
- this.applyClasses(wrapper, classes);
-
- inner.classList.add("tile-inner");
- inner.textContent = tile.value;
-
- if (tile.previousPosition) {
- // Make sure that the tile gets rendered in the previous position first
- window.requestAnimationFrame(function () {
- classes[2] = self.positionClass({ x: tile.x, y: tile.y });
- self.applyClasses(wrapper, classes); // Update the position
- });
- } else if (tile.mergedFrom) {
- classes.push("tile-merged");
- this.applyClasses(wrapper, classes);
-
- // Render the tiles that merged
- tile.mergedFrom.forEach(function (merged) {
- self.addTile(merged);
- });
- } else {
- classes.push("tile-new");
- this.applyClasses(wrapper, classes);
- }
-
- // Add the inner part of the tile to the wrapper
- wrapper.appendChild(inner);
-
- // Put the tile on the board
- this.tileContainer.appendChild(wrapper);
-};
-
-HTMLActuator.prototype.applyClasses = function (element, classes) {
- element.setAttribute("class", classes.join(" "));
-};
-
-HTMLActuator.prototype.normalizePosition = function (position) {
- return { x: position.x + 1, y: position.y + 1 };
-};
-
-HTMLActuator.prototype.positionClass = function (position) {
- position = this.normalizePosition(position);
- return "tile-position-" + position.x + "-" + position.y;
-};
-
-HTMLActuator.prototype.updateScore = function (score) {
- this.clearContainer(this.scoreContainer);
-
- var difference = score - this.score;
- this.score = score;
-
- this.scoreContainer.textContent = this.score;
-
- if (difference > 0) {
- var addition = document.createElement("div");
- addition.classList.add("score-addition");
- addition.textContent = "+" + difference;
-
- this.scoreContainer.appendChild(addition);
- }
-};
-
-HTMLActuator.prototype.updateBestScore = function (bestScore) {
- this.bestContainer.textContent = bestScore;
-};
-
-HTMLActuator.prototype.message = function (won) {
- var type = won ? "game-won" : "game-over";
- var message = won ? "You win!" : "Game over!";
-
- this.messageContainer.classList.add(type);
- this.messageContainer.getElementsByTagName("p")[0].textContent = message;
-};
-
-HTMLActuator.prototype.clearMessage = function () {
- // IE only takes one value to remove at a time.
- this.messageContainer.classList.remove("game-won");
- this.messageContainer.classList.remove("game-over");
-};
diff --git a/sources/js/keyboard_input_manager.js b/sources/js/keyboard_input_manager.js
deleted file mode 100644
index a29744c..0000000
--- a/sources/js/keyboard_input_manager.js
+++ /dev/null
@@ -1,130 +0,0 @@
-function KeyboardInputManager() {
- this.events = {};
-
- if (window.navigator.msPointerEnabled) {
- //Internet Explorer 10 style
- this.eventTouchstart = "MSPointerDown";
- this.eventTouchmove = "MSPointerMove";
- this.eventTouchend = "MSPointerUp";
- } else {
- this.eventTouchstart = "touchstart";
- this.eventTouchmove = "touchmove";
- this.eventTouchend = "touchend";
- }
-
- this.listen();
-}
-
-KeyboardInputManager.prototype.on = function (event, callback) {
- if (!this.events[event]) {
- this.events[event] = [];
- }
- this.events[event].push(callback);
-};
-
-KeyboardInputManager.prototype.emit = function (event, data) {
- var callbacks = this.events[event];
- if (callbacks) {
- callbacks.forEach(function (callback) {
- callback(data);
- });
- }
-};
-
-KeyboardInputManager.prototype.listen = function () {
- var self = this;
-
- var map = {
- 38: 0, // Up
- 39: 1, // Right
- 40: 2, // Down
- 37: 3, // Left
- 75: 0, // vim keybindings
- 76: 1,
- 74: 2,
- 72: 3,
- 87: 0, // W
- 68: 1, // D
- 83: 2, // S
- 65: 3 // A
- };
-
- document.addEventListener("keydown", function (event) {
- var modifiers = event.altKey || event.ctrlKey || event.metaKey ||
- event.shiftKey;
- var mapped = map[event.which];
-
- if (!modifiers) {
- if (mapped !== undefined) {
- event.preventDefault();
- self.emit("move", mapped);
- }
-
- if (event.which === 32) self.restart.bind(self)(event);
- }
- });
-
- var retry = document.querySelector(".retry-button");
- retry.addEventListener("click", this.restart.bind(this));
- retry.addEventListener(this.eventTouchend, this.restart.bind(this));
-
- var keepPlaying = document.querySelector(".keep-playing-button");
- keepPlaying.addEventListener("click", this.keepPlaying.bind(this));
- keepPlaying.addEventListener("touchend", this.keepPlaying.bind(this));
-
- // Listen to swipe events
- var touchStartClientX, touchStartClientY;
- var gameContainer = document.getElementsByClassName("game-container")[0];
-
- gameContainer.addEventListener(this.eventTouchstart, function (event) {
- if (( !window.navigator.msPointerEnabled && event.touches.length > 1) || event.targetTouches > 1) return;
-
- if(window.navigator.msPointerEnabled){
- touchStartClientX = event.pageX;
- touchStartClientY = event.pageY;
- } else {
- touchStartClientX = event.touches[0].clientX;
- touchStartClientY = event.touches[0].clientY;
- }
-
- event.preventDefault();
- });
-
- gameContainer.addEventListener(this.eventTouchmove, function (event) {
- event.preventDefault();
- });
-
- gameContainer.addEventListener(this.eventTouchend, function (event) {
- if (( !window.navigator.msPointerEnabled && event.touches.length > 0) || event.targetTouches > 0) return;
-
- var touchEndClientX, touchEndClientY;
- if(window.navigator.msPointerEnabled){
- touchEndClientX = event.pageX;
- touchEndClientY = event.pageY;
- } else {
- touchEndClientX = event.changedTouches[0].clientX;
- touchEndClientY = event.changedTouches[0].clientY;
- }
-
- var dx = touchEndClientX - touchStartClientX;
- var absDx = Math.abs(dx);
-
- var dy = touchEndClientY - touchStartClientY;
- var absDy = Math.abs(dy);
-
- if (Math.max(absDx, absDy) > 10) {
- // (right : left) : (down : up)
- self.emit("move", absDx > absDy ? (dx > 0 ? 1 : 3) : (dy > 0 ? 2 : 0));
- }
- });
-};
-
-KeyboardInputManager.prototype.restart = function (event) {
- event.preventDefault();
- this.emit("restart");
-};
-
-KeyboardInputManager.prototype.keepPlaying = function (event) {
- event.preventDefault();
- this.emit("keepPlaying");
-};
diff --git a/sources/js/local_score_manager.js b/sources/js/local_score_manager.js
deleted file mode 100644
index ec4575d..0000000
--- a/sources/js/local_score_manager.js
+++ /dev/null
@@ -1,48 +0,0 @@
-window.fakeStorage = {
- _data: {},
-
- setItem: function (id, val) {
- return this._data[id] = String(val);
- },
-
- getItem: function (id) {
- return this._data.hasOwnProperty(id) ? this._data[id] : undefined;
- },
-
- removeItem: function (id) {
- return delete this._data[id];
- },
-
- clear: function () {
- return this._data = {};
- }
-};
-
-function LocalScoreManager() {
- this.key = "bestScore";
-
- var supported = this.localStorageSupported();
- this.storage = supported ? window.localStorage : window.fakeStorage;
-}
-
-LocalScoreManager.prototype.localStorageSupported = function () {
- var testKey = "test";
- var storage = window.localStorage;
-
- try {
- storage.setItem(testKey, "1");
- storage.removeItem(testKey);
- return true;
- } catch (error) {
- return false;
- }
-};
-
-LocalScoreManager.prototype.get = function () {
- return this.storage.getItem(this.key) || 0;
-};
-
-LocalScoreManager.prototype.set = function (score) {
- this.storage.setItem(this.key, score);
-};
-
diff --git a/sources/js/tile.js b/sources/js/tile.js
deleted file mode 100644
index 96f92d7..0000000
--- a/sources/js/tile.js
+++ /dev/null
@@ -1,17 +0,0 @@
-function Tile(position, value) {
- this.x = position.x;
- this.y = position.y;
- this.value = value || 2;
- this.merged = false;
- this.previousPosition = null;
- this.mergedFrom = null; // Tracks tiles that merged together
-}
-
-Tile.prototype.savePosition = function () {
- this.previousPosition = { x: this.x, y: this.y };
-};
-
-Tile.prototype.updatePosition = function (position) {
- this.x = position.x;
- this.y = position.y;
-};
diff --git a/sources/meta/apple-touch-icon.png b/sources/meta/apple-touch-icon.png
deleted file mode 100644
index 3fd20f6..0000000
Binary files a/sources/meta/apple-touch-icon.png and /dev/null differ
diff --git a/sources/style/fonts/ClearSans-Bold-webfont.eot b/sources/style/fonts/ClearSans-Bold-webfont.eot
deleted file mode 100755
index 3678ef2..0000000
Binary files a/sources/style/fonts/ClearSans-Bold-webfont.eot and /dev/null differ
diff --git a/sources/style/fonts/ClearSans-Bold-webfont.svg b/sources/style/fonts/ClearSans-Bold-webfont.svg
deleted file mode 100755
index aa985ae..0000000
--- a/sources/style/fonts/ClearSans-Bold-webfont.svg
+++ /dev/null
@@ -1,640 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/sources/style/fonts/ClearSans-Bold-webfont.woff b/sources/style/fonts/ClearSans-Bold-webfont.woff
deleted file mode 100755
index 184a945..0000000
Binary files a/sources/style/fonts/ClearSans-Bold-webfont.woff and /dev/null differ
diff --git a/sources/style/fonts/ClearSans-Light-webfont.eot b/sources/style/fonts/ClearSans-Light-webfont.eot
deleted file mode 100755
index 0dc609d..0000000
Binary files a/sources/style/fonts/ClearSans-Light-webfont.eot and /dev/null differ
diff --git a/sources/style/fonts/ClearSans-Light-webfont.svg b/sources/style/fonts/ClearSans-Light-webfont.svg
deleted file mode 100755
index 1d5d2ec..0000000
--- a/sources/style/fonts/ClearSans-Light-webfont.svg
+++ /dev/null
@@ -1,670 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/sources/style/fonts/ClearSans-Light-webfont.woff b/sources/style/fonts/ClearSans-Light-webfont.woff
deleted file mode 100755
index 44555e0..0000000
Binary files a/sources/style/fonts/ClearSans-Light-webfont.woff and /dev/null differ
diff --git a/sources/style/fonts/ClearSans-Regular-webfont.eot b/sources/style/fonts/ClearSans-Regular-webfont.eot
deleted file mode 100755
index b020e05..0000000
Binary files a/sources/style/fonts/ClearSans-Regular-webfont.eot and /dev/null differ
diff --git a/sources/style/fonts/ClearSans-Regular-webfont.svg b/sources/style/fonts/ClearSans-Regular-webfont.svg
deleted file mode 100755
index 1e2cffd..0000000
--- a/sources/style/fonts/ClearSans-Regular-webfont.svg
+++ /dev/null
@@ -1,669 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/sources/style/fonts/ClearSans-Regular-webfont.woff b/sources/style/fonts/ClearSans-Regular-webfont.woff
deleted file mode 100755
index 9d58858..0000000
Binary files a/sources/style/fonts/ClearSans-Regular-webfont.woff and /dev/null differ
diff --git a/sources/style/fonts/clear-sans.css b/sources/style/fonts/clear-sans.css
deleted file mode 100755
index de2811d..0000000
--- a/sources/style/fonts/clear-sans.css
+++ /dev/null
@@ -1,30 +0,0 @@
-@font-face {
- font-family: "Clear Sans";
- src: url("ClearSans-Light-webfont.eot");
- src: url("ClearSans-Light-webfont.eot?#iefix") format("embedded-opentype"),
- url("ClearSans-Light-webfont.svg#clear_sans_lightregular") format("svg"),
- url("ClearSans-Light-webfont.woff") format("woff");
- font-weight: 200;
- font-style: normal;
-}
-
-@font-face {
- font-family: "Clear Sans";
- src: url("ClearSans-Regular-webfont.eot");
- src: url("ClearSans-Regular-webfont.eot?#iefix") format("embedded-opentype"),
- url("ClearSans-Regular-webfont.svg#clear_sansregular") format("svg"),
- url("ClearSans-Regular-webfont.woff") format("woff");
- font-weight: normal;
- font-style: normal;
-}
-
-@font-face {
- font-family: "Clear Sans";
- src: url("ClearSans-Bold-webfont.eot");
- src: url("ClearSans-Bold-webfont.eot?#iefix") format("embedded-opentype"),
- url("ClearSans-Bold-webfont.svg#clear_sansbold") format("svg"),
- url("ClearSans-Bold-webfont.woff") format("woff");
- font-weight: 700;
- font-style: normal;
-}
-
diff --git a/sources/style/helpers.scss b/sources/style/helpers.scss
deleted file mode 100644
index 53b9dc1..0000000
--- a/sources/style/helpers.scss
+++ /dev/null
@@ -1,72 +0,0 @@
-// Exponent
-// From: https://github.com/Team-Sass/Sassy-math/blob/master/sass/math.scss#L36
-
-@function exponent($base, $exponent) {
- // reset value
- $value: $base;
- // positive intergers get multiplied
- @if $exponent > 1 {
- @for $i from 2 through $exponent {
- $value: $value * $base; } }
- // negitive intergers get divided. A number divided by itself is 1
- @if $exponent < 1 {
- @for $i from 0 through -$exponent {
- $value: $value / $base; } }
- // return the last value written
- @return $value;
-}
-
-@function pow($base, $exponent) {
- @return exponent($base, $exponent);
-}
-
-// Transition mixins
-@mixin transition($args...) {
- -webkit-transition: $args;
- -moz-transition: $args;
- transition: $args;
-}
-
-@mixin transition-property($args...) {
- -webkit-transition-property: $args;
- -moz-transition-property: $args;
- transition-property: $args;
-}
-
-@mixin animation($args...) {
- -webkit-animation: $args;
- -moz-animation: $args;
- animation: $args;
-}
-
-@mixin animation-fill-mode($args...) {
- -webkit-animation-fill-mode: $args;
- -moz-animation-fill-mode: $args;
- animation-fill-mode: $args;
-}
-
-@mixin transform($args...) {
- -webkit-transform: $args;
- -moz-transform: $args;
- transform: $args;
-}
-
-// Keyframe animations
-@mixin keyframes($animation-name) {
- @-webkit-keyframes $animation-name {
- @content;
- }
- @-moz-keyframes $animation-name {
- @content;
- }
- @keyframes $animation-name {
- @content;
- }
-}
-
-// Media queries
-@mixin smaller($width) {
- @media screen and (max-width: $width) {
- @content;
- }
-}
diff --git a/sources/style/main.css b/sources/style/main.css
deleted file mode 100644
index 8761bd4..0000000
--- a/sources/style/main.css
+++ /dev/null
@@ -1,753 +0,0 @@
-@import url(fonts/clear-sans.css);
-html, body {
- margin: 0;
- padding: 0;
- background: #faf8ef;
- color: #776e65;
- font-family: "Clear Sans", "Helvetica Neue", Arial, sans-serif;
- font-size: 18px; }
-
-body {
- margin: 80px 0; }
-
-.heading:after {
- content: "";
- display: block;
- clear: both; }
-
-h1.title {
- font-size: 80px;
- font-weight: bold;
- margin: 0;
- display: block;
- float: left; }
-
-@-webkit-keyframes move-up {
- 0% {
- top: 25px;
- opacity: 1; }
-
- 100% {
- top: -50px;
- opacity: 0; } }
-@-moz-keyframes move-up {
- 0% {
- top: 25px;
- opacity: 1; }
-
- 100% {
- top: -50px;
- opacity: 0; } }
-@keyframes move-up {
- 0% {
- top: 25px;
- opacity: 1; }
-
- 100% {
- top: -50px;
- opacity: 0; } }
-.scores-container {
- float: right;
- text-align: right; }
-
-.score-container, .best-container {
- position: relative;
- display: inline-block;
- background: #bbada0;
- padding: 15px 25px;
- font-size: 25px;
- height: 25px;
- line-height: 47px;
- font-weight: bold;
- 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: #dddddd; }
- .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"; }
-
-.best-container:after {
- content: "Best"; }
-
-p {
- margin-top: 0;
- margin-bottom: 10px;
- line-height: 1.65; }
-
-a {
- color: #776e65;
- font-weight: bold;
- text-decoration: underline;
- cursor: pointer; }
-
-strong.important {
- text-transform: uppercase; }
-
-hr {
- border: none;
- border-bottom: 1px solid #d8d4d0;
- margin-top: 20px;
- margin-bottom: 30px; }
-
-.container {
- width: 500px;
- margin: 0 auto; }
-
-@-webkit-keyframes fade-in {
- 0% {
- opacity: 0; }
-
- 100% {
- opacity: 1; } }
-@-moz-keyframes fade-in {
- 0% {
- opacity: 0; }
-
- 100% {
- opacity: 1; } }
-@keyframes fade-in {
- 0% {
- opacity: 0; }
-
- 100% {
- opacity: 1; } }
-.game-container {
- margin-top: 40px;
- position: relative;
- padding: 15px;
- cursor: default;
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- background: #bbada0;
- border-radius: 6px;
- width: 500px;
- height: 500px;
- -ms-touch-action: none;
- -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(221, 221, 221, 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(203, 242, 233, 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; }
-
-.grid-row {
- margin-bottom: 15px; }
- .grid-row:last-child {
- margin-bottom: 0; }
- .grid-row:after {
- content: "";
- display: block;
- clear: both; }
-
-.grid-cell {
- width: 82px;
- height: 82px;
- margin-right: 15px;
- float: left;
- border-radius: 3px;
- background: rgba(221, 221, 221, 0.35); }
- .grid-cell:last-child {
- margin-right: 0; }
-
-.tile-container {
- position: absolute;
- z-index: 2; }
-
-.tile, .tile .tile-inner {
- width: 82px;
- height: 82px;
- line-height: 92px; }
-.tile.tile-position-1-1 {
- -webkit-transform: translate(0px, 0px);
- -moz-transform: translate(0px, 0px);
- transform: translate(0px, 0px); }
-.tile.tile-position-1-2 {
- -webkit-transform: translate(0px, 97px);
- -moz-transform: translate(0px, 97px);
- transform: translate(0px, 97px); }
-.tile.tile-position-1-3 {
- -webkit-transform: translate(0px, 194px);
- -moz-transform: translate(0px, 194px);
- transform: translate(0px, 194px); }
-.tile.tile-position-1-4 {
- -webkit-transform: translate(0px, 291px);
- -moz-transform: translate(0px, 291px);
- transform: translate(0px, 291px); }
-.tile.tile-position-1-5 {
- -webkit-transform: translate(0px, 388px);
- -moz-transform: translate(0px, 388px);
- transform: translate(0px, 388px); }
-.tile.tile-position-2-1 {
- -webkit-transform: translate(97px, 0px);
- -moz-transform: translate(97px, 0px);
- transform: translate(97px, 0px); }
-.tile.tile-position-2-2 {
- -webkit-transform: translate(97px, 97px);
- -moz-transform: translate(97px, 97px);
- transform: translate(97px, 97px); }
-.tile.tile-position-2-3 {
- -webkit-transform: translate(97px, 194px);
- -moz-transform: translate(97px, 194px);
- transform: translate(97px, 194px); }
-.tile.tile-position-2-4 {
- -webkit-transform: translate(97px, 291px);
- -moz-transform: translate(97px, 291px);
- transform: translate(97px, 291px); }
-.tile.tile-position-2-5 {
- -webkit-transform: translate(97px, 388px);
- -moz-transform: translate(97px, 388px);
- transform: translate(97px, 388px); }
-.tile.tile-position-3-1 {
- -webkit-transform: translate(194px, 0px);
- -moz-transform: translate(194px, 0px);
- transform: translate(194px, 0px); }
-.tile.tile-position-3-2 {
- -webkit-transform: translate(194px, 97px);
- -moz-transform: translate(194px, 97px);
- transform: translate(194px, 97px); }
-.tile.tile-position-3-3 {
- -webkit-transform: translate(194px, 194px);
- -moz-transform: translate(194px, 194px);
- transform: translate(194px, 194px); }
-.tile.tile-position-3-4 {
- -webkit-transform: translate(194px, 291px);
- -moz-transform: translate(194px, 291px);
- transform: translate(194px, 291px); }
-.tile.tile-position-3-5 {
- -webkit-transform: translate(194px, 388px);
- -moz-transform: translate(194px, 388px);
- transform: translate(194px, 388px); }
-.tile.tile-position-4-1 {
- -webkit-transform: translate(291px, 0px);
- -moz-transform: translate(291px, 0px);
- transform: translate(291px, 0px); }
-.tile.tile-position-4-2 {
- -webkit-transform: translate(291px, 97px);
- -moz-transform: translate(291px, 97px);
- transform: translate(291px, 97px); }
-.tile.tile-position-4-3 {
- -webkit-transform: translate(291px, 194px);
- -moz-transform: translate(291px, 194px);
- transform: translate(291px, 194px); }
-.tile.tile-position-4-4 {
- -webkit-transform: translate(291px, 291px);
- -moz-transform: translate(291px, 291px);
- transform: translate(291px, 291px); }
-.tile.tile-position-4-5 {
- -webkit-transform: translate(291px, 388px);
- -moz-transform: translate(291px, 388px);
- transform: translate(291px, 388px); }
-.tile.tile-position-5-1 {
- -webkit-transform: translate(388px, 0px);
- -moz-transform: translate(388px, 0px);
- transform: translate(388px, 0px); }
-.tile.tile-position-5-2 {
- -webkit-transform: translate(388px, 97px);
- -moz-transform: translate(388px, 97px);
- transform: translate(388px, 97px); }
-.tile.tile-position-5-3 {
- -webkit-transform: translate(388px, 194px);
- -moz-transform: translate(388px, 194px);
- transform: translate(388px, 194px); }
-.tile.tile-position-5-4 {
- -webkit-transform: translate(388px, 291px);
- -moz-transform: translate(388px, 291px);
- transform: translate(388px, 291px); }
-.tile.tile-position-5-5 {
- -webkit-transform: translate(388px, 388px);
- -moz-transform: translate(388px, 388px);
- transform: translate(388px, 388px); }
-
-.tile {
- position: absolute;
- -webkit-transition: 100ms ease-in-out;
- -moz-transition: 100ms ease-in-out;
- 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: #dddddd;
- text-align: center;
- font-weight: bold;
- z-index: 10;
- font-size: 55px; }
- .tile.tile-3 .tile-inner {
- background: #d8c1d3; }
- .tile.tile-9 .tile-inner {
- background: #bcd7de; }
- .tile.tile-27 .tile-inner {
- color: #f9f6f2;
- background: #ca96c3; }
- .tile.tile-81 .tile-inner {
- color: #f9f6f2;
- background: #83aec1; }
- .tile.tile-243 .tile-inner {
- color: #f9f6f2;
- background: #ae7ca9;
- font-size: 45px; }
- @media screen and (max-width: 520px) {
- .tile.tile-243 .tile-inner {
- font-size: 25px; } }
- .tile.tile-729 .tile-inner {
- color: #f9f6f2;
- background: #6dcdb5;
- font-size: 45px; }
- @media screen and (max-width: 520px) {
- .tile.tile-729 .tile-inner {
- font-size: 25px; } }
- .tile.tile-2187 .tile-inner {
- color: #f9f6f2;
- background: #d2e9e4;
- box-shadow: 0 0 30px 10px rgba(255, 255, 255, 0.2381), inset 0 0 0 1px rgba(255, 255, 255, 0.14286);
- font-size: 35px; }
- @media screen and (max-width: 520px) {
- .tile.tile-2187 .tile-inner {
- font-size: 15px; } }
- .tile.tile-6561 .tile-inner {
- color: #f9f6f2;
- background: #d0ebe5;
- box-shadow: 0 0 30px 10px rgba(255, 255, 255, 0.31746), inset 0 0 0 1px rgba(255, 255, 255, 0.19048);
- font-size: 35px; }
- @media screen and (max-width: 520px) {
- .tile.tile-6561 .tile-inner {
- font-size: 15px; } }
- .tile.tile-19683 .tile-inner {
- color: #f9f6f2;
- background: #ceede6;
- box-shadow: 0 0 30px 10px rgba(255, 255, 255, 0.39683), inset 0 0 0 1px rgba(255, 255, 255, 0.2381);
- font-size: 35px; }
- @media screen and (max-width: 520px) {
- .tile.tile-19683 .tile-inner {
- font-size: 15px; } }
- .tile.tile-59049 .tile-inner {
- color: #f9f6f2;
- background: #ccefe7;
- box-shadow: 0 0 30px 10px rgba(255, 255, 255, 0.47619), inset 0 0 0 1px rgba(255, 255, 255, 0.28571);
- font-size: 35px; }
- @media screen and (max-width: 520px) {
- .tile.tile-59049 .tile-inner {
- font-size: 15px; } }
- .tile.tile-177147 .tile-inner {
- color: #f9f6f2;
- background: #cbf2e9;
- box-shadow: 0 0 30px 10px rgba(255, 255, 255, 0.55556), inset 0 0 0 1px rgba(255, 255, 255, 0.33333);
- font-size: 35px; }
- @media screen and (max-width: 520px) {
- .tile.tile-177147 .tile-inner {
- font-size: 15px; } }
- .tile.tile-super .tile-inner {
- color: #f9f6f2;
- background: #9e2187;
- font-size: 30px; }
- @media screen and (max-width: 520px) {
- .tile.tile-super .tile-inner {
- font-size: 10px; } }
-
-@-webkit-keyframes appear {
- 0% {
- opacity: 0;
- -webkit-transform: scale(0);
- -moz-transform: scale(0);
- transform: scale(0); }
-
- 100% {
- opacity: 1;
- -webkit-transform: scale(1);
- -moz-transform: scale(1);
- transform: scale(1); } }
-@-moz-keyframes appear {
- 0% {
- opacity: 0;
- -webkit-transform: scale(0);
- -moz-transform: scale(0);
- transform: scale(0); }
-
- 100% {
- opacity: 1;
- -webkit-transform: scale(1);
- -moz-transform: scale(1);
- transform: scale(1); } }
-@keyframes appear {
- 0% {
- opacity: 0;
- -webkit-transform: scale(0);
- -moz-transform: scale(0);
- transform: scale(0); }
-
- 100% {
- opacity: 1;
- -webkit-transform: scale(1);
- -moz-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; }
-
-@-webkit-keyframes pop {
- 0% {
- -webkit-transform: scale(0);
- -moz-transform: scale(0);
- transform: scale(0); }
-
- 50% {
- -webkit-transform: scale(1.2);
- -moz-transform: scale(1.2);
- transform: scale(1.2); }
-
- 100% {
- -webkit-transform: scale(1);
- -moz-transform: scale(1);
- transform: scale(1); } }
-@-moz-keyframes pop {
- 0% {
- -webkit-transform: scale(0);
- -moz-transform: scale(0);
- transform: scale(0); }
-
- 50% {
- -webkit-transform: scale(1.2);
- -moz-transform: scale(1.2);
- transform: scale(1.2); }
-
- 100% {
- -webkit-transform: scale(1);
- -moz-transform: scale(1);
- transform: scale(1); } }
-@keyframes pop {
- 0% {
- -webkit-transform: scale(0);
- -moz-transform: scale(0);
- transform: scale(0); }
-
- 50% {
- -webkit-transform: scale(1.2);
- -moz-transform: scale(1.2);
- transform: scale(1.2); }
-
- 100% {
- -webkit-transform: scale(1);
- -moz-transform: scale(1);
- transform: scale(1); } }
-.tile-merged .tile-inner {
- z-index: 20;
- -webkit-animation: pop 200ms ease 100ms;
- -moz-animation: pop 200ms ease 100ms;
- animation: pop 200ms ease 100ms;
- -webkit-animation-fill-mode: backwards;
- -moz-animation-fill-mode: backwards;
- animation-fill-mode: backwards; }
-
-.game-intro {
- margin-bottom: 0; }
-
-.game-explanation {
- margin-top: 50px; }
-
-@media screen and (max-width: 520px) {
- html, body {
- font-size: 15px; }
-
- body {
- margin: 20px 0;
- padding: 0 20px; }
-
- h1.title {
- font-size: 27px;
- margin-top: 15px; }
-
- .container {
- width: 280px;
- margin: 0 auto; }
-
- .score-container, .best-container {
- margin-top: 0;
- padding: 15px 10px;
- min-width: 40px; }
-
- .heading {
- margin-bottom: 10px; }
-
- .game-container {
- margin-top: 40px;
- position: relative;
- padding: 10px;
- cursor: default;
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- background: #bbada0;
- border-radius: 6px;
- width: 280px;
- height: 280px;
- -ms-touch-action: none;
- -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(221, 221, 221, 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(203, 242, 233, 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; }
-
- .grid-row {
- margin-bottom: 10px; }
- .grid-row:last-child {
- margin-bottom: 0; }
- .grid-row:after {
- content: "";
- display: block;
- clear: both; }
-
- .grid-cell {
- width: 44px;
- height: 44px;
- margin-right: 10px;
- float: left;
- border-radius: 3px;
- background: rgba(221, 221, 221, 0.35); }
- .grid-cell:last-child {
- margin-right: 0; }
-
- .tile-container {
- position: absolute;
- z-index: 2; }
-
- .tile, .tile .tile-inner {
- width: 44px;
- height: 44px;
- line-height: 54px; }
- .tile.tile-position-1-1 {
- -webkit-transform: translate(0px, 0px);
- -moz-transform: translate(0px, 0px);
- transform: translate(0px, 0px); }
- .tile.tile-position-1-2 {
- -webkit-transform: translate(0px, 54px);
- -moz-transform: translate(0px, 54px);
- transform: translate(0px, 54px); }
- .tile.tile-position-1-3 {
- -webkit-transform: translate(0px, 108px);
- -moz-transform: translate(0px, 108px);
- transform: translate(0px, 108px); }
- .tile.tile-position-1-4 {
- -webkit-transform: translate(0px, 162px);
- -moz-transform: translate(0px, 162px);
- transform: translate(0px, 162px); }
- .tile.tile-position-1-5 {
- -webkit-transform: translate(0px, 216px);
- -moz-transform: translate(0px, 216px);
- transform: translate(0px, 216px); }
- .tile.tile-position-2-1 {
- -webkit-transform: translate(54px, 0px);
- -moz-transform: translate(54px, 0px);
- transform: translate(54px, 0px); }
- .tile.tile-position-2-2 {
- -webkit-transform: translate(54px, 54px);
- -moz-transform: translate(54px, 54px);
- transform: translate(54px, 54px); }
- .tile.tile-position-2-3 {
- -webkit-transform: translate(54px, 108px);
- -moz-transform: translate(54px, 108px);
- transform: translate(54px, 108px); }
- .tile.tile-position-2-4 {
- -webkit-transform: translate(54px, 162px);
- -moz-transform: translate(54px, 162px);
- transform: translate(54px, 162px); }
- .tile.tile-position-2-5 {
- -webkit-transform: translate(54px, 216px);
- -moz-transform: translate(54px, 216px);
- transform: translate(54px, 216px); }
- .tile.tile-position-3-1 {
- -webkit-transform: translate(108px, 0px);
- -moz-transform: translate(108px, 0px);
- transform: translate(108px, 0px); }
- .tile.tile-position-3-2 {
- -webkit-transform: translate(108px, 54px);
- -moz-transform: translate(108px, 54px);
- transform: translate(108px, 54px); }
- .tile.tile-position-3-3 {
- -webkit-transform: translate(108px, 108px);
- -moz-transform: translate(108px, 108px);
- transform: translate(108px, 108px); }
- .tile.tile-position-3-4 {
- -webkit-transform: translate(108px, 162px);
- -moz-transform: translate(108px, 162px);
- transform: translate(108px, 162px); }
- .tile.tile-position-3-5 {
- -webkit-transform: translate(108px, 216px);
- -moz-transform: translate(108px, 216px);
- transform: translate(108px, 216px); }
- .tile.tile-position-4-1 {
- -webkit-transform: translate(162px, 0px);
- -moz-transform: translate(162px, 0px);
- transform: translate(162px, 0px); }
- .tile.tile-position-4-2 {
- -webkit-transform: translate(162px, 54px);
- -moz-transform: translate(162px, 54px);
- transform: translate(162px, 54px); }
- .tile.tile-position-4-3 {
- -webkit-transform: translate(162px, 108px);
- -moz-transform: translate(162px, 108px);
- transform: translate(162px, 108px); }
- .tile.tile-position-4-4 {
- -webkit-transform: translate(162px, 162px);
- -moz-transform: translate(162px, 162px);
- transform: translate(162px, 162px); }
- .tile.tile-position-4-5 {
- -webkit-transform: translate(162px, 216px);
- -moz-transform: translate(162px, 216px);
- transform: translate(162px, 216px); }
- .tile.tile-position-5-1 {
- -webkit-transform: translate(216px, 0px);
- -moz-transform: translate(216px, 0px);
- transform: translate(216px, 0px); }
- .tile.tile-position-5-2 {
- -webkit-transform: translate(216px, 54px);
- -moz-transform: translate(216px, 54px);
- transform: translate(216px, 54px); }
- .tile.tile-position-5-3 {
- -webkit-transform: translate(216px, 108px);
- -moz-transform: translate(216px, 108px);
- transform: translate(216px, 108px); }
- .tile.tile-position-5-4 {
- -webkit-transform: translate(216px, 162px);
- -moz-transform: translate(216px, 162px);
- transform: translate(216px, 162px); }
- .tile.tile-position-5-5 {
- -webkit-transform: translate(216px, 216px);
- -moz-transform: translate(216px, 216px);
- transform: translate(216px, 216px); }
-
- .game-container {
- margin-top: 20px; }
-
- .tile .tile-inner {
- font-size: 35px; }
-
- .game-message p {
- font-size: 30px !important;
- height: 30px !important;
- line-height: 30px !important;
- margin-top: 90px !important; }
- .game-message .lower {
- margin-top: 30px !important; } }
diff --git a/sources/style/main.scss b/sources/style/main.scss
deleted file mode 100644
index 58082ac..0000000
--- a/sources/style/main.scss
+++ /dev/null
@@ -1,520 +0,0 @@
-@import "helpers";
-@import "fonts/clear-sans.css";
-
-$field-width: 500px;
-$grid-spacing: 15px;
-$grid-row-cells: 5;
-$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: #dddddd;
-$tile-gold-color: #CBF2E9;
-$tile-super-color: #9E2187;
-$tile-gold-glow-color: lighten($tile-gold-color, 15%);
-
-$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:after {
- content: "";
- display: block;
- clear: both;
-}
-
-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: 40px;
- position: relative;
- padding: $grid-spacing;
-
- cursor: default;
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -moz-user-select: none;
-
- background: $game-container-background;
- border-radius: $tile-border-radius * 2;
- width: $field-width;
- height: $field-width;
- -ms-touch-action: none;
- -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: 3;
- $exponent: 1;
- $limit: 11;
-
- // Colors for all 11 states, false = no special color
- $special-colors: #D4ABCC false, // 2
- #A4D1DE false, // 4
- #BF5AAD true, // 8
- #4084A8 true, // 16
- #8F277C true, // 32
- #1AB890 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: $tile-super-color;
-
- 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);
-}
-
-.game-intro {
- margin-bottom: 0;
-}
-
-.game-explanation {
- margin-top: 50px;
-}
-
-@include smaller($mobile-threshold) {
- // Redefine variables for smaller screens
- $field-width: 280px;
- $grid-spacing: 10px;
- $grid-row-cells: 5;
- $tile-size: ($field-width - $grid-spacing * ($grid-row-cells + 1)) / $grid-row-cells;
- $tile-border-radius: 3px;
-
- 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;
- }
-
- // Render the game field at the right width
- @include game-field;
-
- .game-container {
- margin-top: 20px;
- }
-
- // 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;
- }
- }
-}