A Pen by Anthony Guerra on CodePen.
Last active
September 4, 2018 21:15
-
-
Save anthonyisamodder/2a45774ed0b4ae12bfcf1984a96b5e7a to your computer and use it in GitHub Desktop.
2048 game
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<!--The HTML, CSS, and JS is not offical. Source: http://2048game.com/ --> | |
<div class="heading"> | |
<h1 class="title"><a href="/">2048</a></h1> | |
<div class="scores-container"> | |
<div class="score-container">0</div> | |
<div class="best-container">2960</div> | |
</div> | |
</div> | |
<div class="game-intro"> | |
<a class="restart-button">New Game</a> | |
<h2 class="subtitle">Play <strong>2048 Game</strong> Online</h2> | |
<div class="above-game"> | |
<p>Join the numbers and get to the <strong>2048 tile!</strong></p> | |
</div> | |
</div> | |
<div class="game-container"> | |
<div class="game-message"> | |
<p></p> | |
<div class="lower"> | |
<a class="keep-playing-button">Keep playing</a> | |
<a class="retry-button">Try again</a> | |
<div class="score-sharing"> | |
</div> | |
</div> | |
</div> | |
<div class="grid-container"> | |
<div class="grid-row"> | |
<div class="grid-cell"></div> | |
<div class="grid-cell"></div> | |
<div class="grid-cell"></div> | |
<div class="grid-cell"></div> | |
</div> | |
<div class="grid-row"> | |
<div class="grid-cell"></div> | |
<div class="grid-cell"></div> | |
<div class="grid-cell"></div> | |
<div class="grid-cell"></div> | |
</div> | |
<div class="grid-row"> | |
<div class="grid-cell"></div> | |
<div class="grid-cell"></div> | |
<div class="grid-cell"></div> | |
<div class="grid-cell"></div> | |
</div> | |
<div class="grid-row"> | |
<div class="grid-cell"></div> | |
<div class="grid-cell"></div> | |
<div class="grid-cell"></div> | |
<div class="grid-cell"></div> | |
</div> | |
</div> | |
<div class="tile-container"><div class="tile tile-4 tile-position-3-4 tile-new"><div class="tile-inner">4</div></div><div class="tile tile-2 tile-position-4-1 tile-new"><div class="tile-inner">2</div></div></div> | |
</div> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Function.prototype.bind = Function.prototype.bind || function(a) { | |
var b = this; | |
return function(c) { | |
c instanceof Array || (c = [c]); | |
b.apply(a, c) | |
} | |
} | |
; | |
(function() { | |
function a(a) { | |
this.el = a; | |
a = a.className.replace(/^\s+|\s+$/g, "").split(/\s+/); | |
for (var b = 0; b < a.length; b++) | |
d.call(this, a[b]) | |
} | |
function b(a, b, c) { | |
Object.defineProperty ? Object.defineProperty(a, b, { | |
get: c | |
}) : a.__defineGetter__(b, c) | |
} | |
if (!("undefined" === typeof window.Element || "classList"in document.documentElement)) { | |
var c = Array.prototype | |
, d = c.push | |
, e = c.splice | |
, f = c.join; | |
a.prototype = { | |
add: function(a) { | |
this.contains(a) || (d.call(this, a), | |
this.el.className = this.toString()) | |
}, | |
contains: function(a) { | |
return -1 != this.el.className.indexOf(a) | |
}, | |
item: function(a) { | |
return this[a] || null | |
}, | |
remove: function(a) { | |
if (this.contains(a)) { | |
for (var b = 0; b < this.length && this[b] != a; b++) | |
; | |
e.call(this, b, 1); | |
this.el.className = this.toString() | |
} | |
}, | |
toString: function() { | |
return f.call(this, " ") | |
}, | |
toggle: function(a) { | |
this.contains(a) ? this.remove(a) : this.add(a); | |
return this.contains(a) | |
} | |
}; | |
window.DOMTokenList = a; | |
b(HTMLElement.prototype, "classList", function() { | |
return new a(this) | |
}) | |
} | |
})(); | |
(function() { | |
for (var a = 0, b = ["webkit", "moz"], c = 0; c < b.length && !window.requestAnimationFrame; ++c) | |
window.requestAnimationFrame = window[b[c] + "RequestAnimationFrame"], | |
window.cancelAnimationFrame = window[b[c] + "CancelAnimationFrame"] || window[b[c] + "CancelRequestAnimationFrame"]; | |
window.requestAnimationFrame || (window.requestAnimationFrame = function(b, c) { | |
var f = (new Date).getTime() | |
, h = Math.max(0, 16 - (f - a)) | |
, g = window.setTimeout(function() { | |
b(f + h) | |
}, h); | |
a = f + h; | |
return g | |
} | |
); | |
window.cancelAnimationFrame || (window.cancelAnimationFrame = function(a) { | |
clearTimeout(a) | |
} | |
) | |
})(); | |
function KeyboardInputManager() { | |
this.events = {}; | |
window.navigator.msPointerEnabled ? (this.eventTouchstart = "MSPointerDown", | |
this.eventTouchmove = "MSPointerMove", | |
this.eventTouchend = "MSPointerUp") : (this.eventTouchstart = "touchstart", | |
this.eventTouchmove = "touchmove", | |
this.eventTouchend = "touchend"); | |
this.listen() | |
} | |
KeyboardInputManager.prototype.on = function(a, b) { | |
this.events[a] || (this.events[a] = []); | |
this.events[a].push(b) | |
} | |
; | |
KeyboardInputManager.prototype.emit = function(a, b) { | |
var c = this.events[a]; | |
c && c.forEach(function(a) { | |
a(b) | |
}) | |
} | |
; | |
KeyboardInputManager.prototype.listen = function() { | |
var a = this | |
, b = { | |
38: 0, | |
39: 1, | |
40: 2, | |
37: 3, | |
75: 0, | |
76: 1, | |
74: 2, | |
72: 3, | |
87: 0, | |
68: 1, | |
83: 2, | |
65: 3 | |
}; | |
document.addEventListener("keydown", function(c) { | |
var d = c.altKey || c.ctrlKey || c.metaKey || c.shiftKey | |
, e = b[c.which]; | |
d || void 0 === e || (c.preventDefault(), | |
a.emit("move", e)); | |
d || 82 !== c.which || a.restart.call(a, c) | |
}); | |
this.bindButtonPress(".retry-button", this.restart); | |
this.bindButtonPress(".restart-button", this.restart); | |
this.bindButtonPress(".keep-playing-button", this.keepPlaying); | |
var c, d, e = document.getElementsByClassName("game-container")[0]; | |
e.addEventListener(this.eventTouchstart, function(a) { | |
!window.navigator.msPointerEnabled && 1 < a.touches.length || 1 < a.targetTouches || (window.navigator.msPointerEnabled ? (c = a.pageX, | |
d = a.pageY) : (c = a.touches[0].clientX, | |
d = a.touches[0].clientY), | |
a.preventDefault()) | |
}); | |
e.addEventListener(this.eventTouchmove, function(a) { | |
a.preventDefault() | |
}); | |
e.addEventListener(this.eventTouchend, function(b) { | |
if (!(!window.navigator.msPointerEnabled && 0 < b.touches.length || 0 < b.targetTouches)) { | |
var e, g; | |
window.navigator.msPointerEnabled ? (e = b.pageX, | |
g = b.pageY) : (e = b.changedTouches[0].clientX, | |
g = b.changedTouches[0].clientY); | |
e -= c; | |
b = Math.abs(e); | |
g -= d; | |
var m = Math.abs(g); | |
10 < Math.max(b, m) && a.emit("move", b > m ? 0 < e ? 1 : 3 : 0 < g ? 2 : 0) | |
} | |
}) | |
} | |
; | |
KeyboardInputManager.prototype.restart = function(a) { | |
a.preventDefault(); | |
this.emit("restart") | |
} | |
; | |
KeyboardInputManager.prototype.keepPlaying = function(a) { | |
a.preventDefault(); | |
this.emit("keepPlaying") | |
} | |
; | |
KeyboardInputManager.prototype.bindButtonPress = function(a, b) { | |
var c = document.querySelector(a); | |
c.addEventListener("click", b.bind(this)); | |
c.addEventListener(this.eventTouchend, b.bind(this)) | |
} | |
; | |
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.sharingContainer = document.querySelector(".score-sharing"); | |
this.score = 0 | |
} | |
HTMLActuator.prototype.actuate = function(a, b) { | |
var c = this; | |
window.requestAnimationFrame(function() { | |
c.clearContainer(c.tileContainer); | |
a.cells.forEach(function(a) { | |
a.forEach(function(a) { | |
a && c.addTile(a) | |
}) | |
}); | |
c.updateScore(b.score); | |
c.updateBestScore(b.bestScore); | |
b.terminated && (b.over ? c.message(!1) : b.won && c.message(!0)) | |
}) | |
} | |
; | |
HTMLActuator.prototype.continueGame = function() { | |
this.clearMessage() | |
} | |
; | |
HTMLActuator.prototype.clearContainer = function(a) { | |
for (; a.firstChild; ) | |
a.removeChild(a.firstChild) | |
} | |
; | |
HTMLActuator.prototype.addTile = function(a) { | |
var b = this | |
, c = document.createElement("div") | |
, d = document.createElement("div") | |
, e = this.positionClass(a.previousPosition || { | |
x: a.x, | |
y: a.y | |
}) | |
, f = ["tile", "tile-" + a.value, e]; | |
2048 < a.value && f.push("tile-super"); | |
this.applyClasses(c, f); | |
d.classList.add("tile-inner"); | |
d.textContent = a.value; | |
a.previousPosition ? window.requestAnimationFrame(function() { | |
f[2] = b.positionClass({ | |
x: a.x, | |
y: a.y | |
}); | |
b.applyClasses(c, f) | |
}) : a.mergedFrom ? (f.push("tile-merged"), | |
this.applyClasses(c, f), | |
a.mergedFrom.forEach(function(a) { | |
b.addTile(a) | |
})) : (f.push("tile-new"), | |
this.applyClasses(c, f)); | |
c.appendChild(d); | |
this.tileContainer.appendChild(c) | |
} | |
; | |
HTMLActuator.prototype.applyClasses = function(a, b) { | |
a.setAttribute("class", b.join(" ")) | |
} | |
; | |
HTMLActuator.prototype.normalizePosition = function(a) { | |
return { | |
x: a.x + 1, | |
y: a.y + 1 | |
} | |
} | |
; | |
HTMLActuator.prototype.positionClass = function(a) { | |
a = this.normalizePosition(a); | |
return "tile-position-" + a.x + "-" + a.y | |
} | |
; | |
HTMLActuator.prototype.updateScore = function(a) { | |
this.clearContainer(this.scoreContainer); | |
var b = a - this.score; | |
this.score = a; | |
this.scoreContainer.textContent = this.score; | |
0 < b && (a = document.createElement("div"), | |
a.classList.add("score-addition"), | |
a.textContent = "+" + b, | |
this.scoreContainer.appendChild(a)) | |
} | |
; | |
HTMLActuator.prototype.updateBestScore = function(a) { | |
this.bestContainer.textContent = a | |
} | |
; | |
HTMLActuator.prototype.message = function(a) { | |
var b = a ? "You win!" : "Game over!"; | |
this.messageContainer.classList.add(a ? "game-won" : "game-over"); | |
this.messageContainer.getElementsByTagName("p")[0].textContent = b; | |
this.clearContainer(this.sharingContainer); | |
this.sharingContainer.appendChild(this.scoreTweetButton()); | |
twttr.widgets.load() | |
} | |
; | |
HTMLActuator.prototype.clearMessage = function() { | |
this.messageContainer.classList.remove("game-won"); | |
this.messageContainer.classList.remove("game-over") | |
} | |
; | |
HTMLActuator.prototype.scoreTweetButton = function() { | |
var a = document.createElement("a"); | |
a.classList.add("twitter-share-button"); | |
a.setAttribute("href", "https://twitter.com/share"); | |
a.setAttribute("data-url", "http://2048game.com"); | |
a.setAttribute("data-counturl", "http://2048game.com"); | |
a.textContent = "Tweet"; | |
a.setAttribute("data-text", "I scored " + this.score + " points at 2048, a game where you join numbers to score high! #2048game"); | |
return a | |
} | |
; | |
function Grid(a, b) { | |
this.size = a; | |
this.cells = b ? this.fromState(b) : this.empty() | |
} | |
Grid.prototype.empty = function() { | |
for (var a = [], b = 0; b < this.size; b++) | |
for (var c = a[b] = [], d = 0; d < this.size; d++) | |
c.push(null); | |
return a | |
} | |
; | |
Grid.prototype.fromState = function(a) { | |
for (var b = [], c = 0; c < this.size; c++) | |
for (var d = b[c] = [], e = 0; e < this.size; e++) { | |
var f = a[c][e]; | |
d.push(f ? new Tile(f.position,f.value) : null) | |
} | |
return b | |
} | |
; | |
Grid.prototype.randomAvailableCell = function() { | |
var a = this.availableCells(); | |
if (a.length) | |
return a[Math.floor(Math.random() * a.length)] | |
} | |
; | |
Grid.prototype.availableCells = function() { | |
var a = []; | |
this.eachCell(function(b, c, d) { | |
d || a.push({ | |
x: b, | |
y: c | |
}) | |
}); | |
return a | |
} | |
; | |
Grid.prototype.eachCell = function(a) { | |
for (var b = 0; b < this.size; b++) | |
for (var c = 0; c < this.size; c++) | |
a(b, c, this.cells[b][c]) | |
} | |
; | |
Grid.prototype.cellsAvailable = function() { | |
return !!this.availableCells().length | |
} | |
; | |
Grid.prototype.cellAvailable = function(a) { | |
return !this.cellOccupied(a) | |
} | |
; | |
Grid.prototype.cellOccupied = function(a) { | |
return !!this.cellContent(a) | |
} | |
; | |
Grid.prototype.cellContent = function(a) { | |
return this.withinBounds(a) ? this.cells[a.x][a.y] : null | |
} | |
; | |
Grid.prototype.insertTile = function(a) { | |
this.cells[a.x][a.y] = a | |
} | |
; | |
Grid.prototype.removeTile = function(a) { | |
this.cells[a.x][a.y] = null | |
} | |
; | |
Grid.prototype.withinBounds = function(a) { | |
return 0 <= a.x && a.x < this.size && 0 <= a.y && a.y < this.size | |
} | |
; | |
Grid.prototype.serialize = function() { | |
for (var a = [], b = 0; b < this.size; b++) | |
for (var c = a[b] = [], d = 0; d < this.size; d++) | |
c.push(this.cells[b][d] ? this.cells[b][d].serialize() : null); | |
return { | |
size: this.size, | |
cells: a | |
} | |
} | |
; | |
function Tile(a, b) { | |
this.x = a.x; | |
this.y = a.y; | |
this.value = b || 2; | |
this.mergedFrom = this.previousPosition = null | |
} | |
Tile.prototype.savePosition = function() { | |
this.previousPosition = { | |
x: this.x, | |
y: this.y | |
} | |
} | |
; | |
Tile.prototype.updatePosition = function(a) { | |
this.x = a.x; | |
this.y = a.y | |
} | |
; | |
Tile.prototype.serialize = function() { | |
return { | |
position: { | |
x: this.x, | |
y: this.y | |
}, | |
value: this.value | |
} | |
} | |
; | |
window.fakeStorage = { | |
_data: {}, | |
setItem: function(a, b) { | |
return this._data[a] = String(b) | |
}, | |
getItem: function(a) { | |
return this._data.hasOwnProperty(a) ? this._data[a] : void 0 | |
}, | |
removeItem: function(a) { | |
return delete this._data[a] | |
}, | |
clear: function() { | |
return this._data = {} | |
} | |
}; | |
function LocalStorageManager() { | |
this.bestScoreKey = "bestScore"; | |
this.gameStateKey = "gameState"; | |
this.storage = this.localStorageSupported() ? window.localStorage : window.fakeStorage | |
} | |
LocalStorageManager.prototype.localStorageSupported = function() { | |
var a = window.localStorage; | |
try { | |
return a.setItem("test", "1"), | |
a.removeItem("test"), | |
!0 | |
} catch (b) { | |
return !1 | |
} | |
} | |
; | |
LocalStorageManager.prototype.getBestScore = function() { | |
return this.storage.getItem(this.bestScoreKey) || 0 | |
} | |
; | |
LocalStorageManager.prototype.setBestScore = function(a) { | |
this.storage.setItem(this.bestScoreKey, a) | |
} | |
; | |
LocalStorageManager.prototype.getGameState = function() { | |
var a = this.storage.getItem(this.gameStateKey); | |
return a ? JSON.parse(a) : null | |
} | |
; | |
LocalStorageManager.prototype.setGameState = function(a) { | |
this.storage.setItem(this.gameStateKey, JSON.stringify(a)) | |
} | |
; | |
LocalStorageManager.prototype.clearGameState = function() { | |
this.storage.removeItem(this.gameStateKey) | |
} | |
; | |
function GameManager(a, b, c, d) { | |
this.size = a; | |
this.inputManager = new b; | |
this.storageManager = new d; | |
this.actuator = new c; | |
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() | |
} | |
GameManager.prototype.restart = function() { | |
this.storageManager.clearGameState(); | |
this.actuator.continueGame(); | |
this.setup() | |
} | |
; | |
GameManager.prototype.keepPlaying = function() { | |
this.keepPlaying = !0; | |
this.actuator.continueGame() | |
} | |
; | |
GameManager.prototype.isGameTerminated = function() { | |
return this.over || this.won && !this.keepPlaying ? !0 : !1 | |
} | |
; | |
GameManager.prototype.setup = function() { | |
var a = this.storageManager.getGameState(); | |
a ? (this.grid = new Grid(a.grid.size,a.grid.cells), | |
this.score = a.score, | |
this.over = a.over, | |
this.won = a.won, | |
this.keepPlaying = a.keepPlaying) : (this.grid = new Grid(this.size), | |
this.score = 0, | |
this.keepPlaying = this.won = this.over = !1, | |
this.addStartTiles()); | |
this.actuate() | |
} | |
; | |
GameManager.prototype.addStartTiles = function() { | |
for (var a = 0; a < this.startTiles; a++) | |
this.addRandomTile() | |
} | |
; | |
GameManager.prototype.addRandomTile = function() { | |
if (this.grid.cellsAvailable()) { | |
var a = 0.9 > Math.random() ? 2 : 4 | |
, a = new Tile(this.grid.randomAvailableCell(),a); | |
this.grid.insertTile(a) | |
} | |
} | |
; | |
GameManager.prototype.actuate = function() { | |
this.storageManager.getBestScore() < this.score && this.storageManager.setBestScore(this.score); | |
this.over ? this.storageManager.clearGameState() : this.storageManager.setGameState(this.serialize()); | |
this.actuator.actuate(this.grid, { | |
score: this.score, | |
over: this.over, | |
won: this.won, | |
bestScore: this.storageManager.getBestScore(), | |
terminated: this.isGameTerminated() | |
}) | |
} | |
; | |
GameManager.prototype.serialize = function() { | |
return { | |
grid: this.grid.serialize(), | |
score: this.score, | |
over: this.over, | |
won: this.won, | |
keepPlaying: this.keepPlaying | |
} | |
} | |
; | |
GameManager.prototype.prepareTiles = function() { | |
this.grid.eachCell(function(a, b, c) { | |
c && (c.mergedFrom = null, | |
c.savePosition()) | |
}) | |
} | |
; | |
GameManager.prototype.moveTile = function(a, b) { | |
this.grid.cells[a.x][a.y] = null; | |
this.grid.cells[b.x][b.y] = a; | |
a.updatePosition(b) | |
} | |
; | |
GameManager.prototype.move = function(a) { | |
var b = this; | |
if (!this.isGameTerminated()) { | |
var c, d, e = this.getVector(a), f = this.buildTraversals(e), h = !1; | |
this.prepareTiles(); | |
f.x.forEach(function(a) { | |
f.y.forEach(function(f) { | |
c = { | |
x: a, | |
y: f | |
}; | |
if (d = b.grid.cellContent(c)) { | |
f = b.findFarthestPosition(c, e); | |
var k = b.grid.cellContent(f.next); | |
if (k && k.value === d.value && !k.mergedFrom) { | |
var l = new Tile(f.next,2 * d.value); | |
l.mergedFrom = [d, k]; | |
b.grid.insertTile(l); | |
b.grid.removeTile(d); | |
d.updatePosition(f.next); | |
b.score += l.value; | |
2048 === l.value && (b.won = !0) | |
} else | |
b.moveTile(d, f.farthest); | |
b.positionsEqual(c, d) || (h = !0) | |
} | |
}) | |
}); | |
h && (this.addRandomTile(), | |
this.movesAvailable() || (this.over = !0), | |
this.actuate()) | |
} | |
} | |
; | |
GameManager.prototype.getVector = function(a) { | |
return { | |
0: { | |
x: 0, | |
y: -1 | |
}, | |
1: { | |
x: 1, | |
y: 0 | |
}, | |
2: { | |
x: 0, | |
y: 1 | |
}, | |
3: { | |
x: -1, | |
y: 0 | |
} | |
}[a] | |
} | |
; | |
GameManager.prototype.buildTraversals = function(a) { | |
for (var b = { | |
x: [], | |
y: [] | |
}, c = 0; c < this.size; c++) | |
b.x.push(c), | |
b.y.push(c); | |
1 === a.x && (b.x = b.x.reverse()); | |
1 === a.y && (b.y = b.y.reverse()); | |
return b | |
} | |
; | |
GameManager.prototype.findFarthestPosition = function(a, b) { | |
var c; | |
do | |
c = a, | |
a = { | |
x: c.x + b.x, | |
y: c.y + b.y | |
}; | |
while (this.grid.withinBounds(a) && this.grid.cellAvailable(a));return { | |
farthest: c, | |
next: a | |
} | |
} | |
; | |
GameManager.prototype.movesAvailable = function() { | |
return this.grid.cellsAvailable() || this.tileMatchesAvailable() | |
} | |
; | |
GameManager.prototype.tileMatchesAvailable = function() { | |
for (var a, b = 0; b < this.size; b++) | |
for (var c = 0; c < this.size; c++) | |
if (a = this.grid.cellContent({ | |
x: b, | |
y: c | |
})) | |
for (var d = 0; 4 > d; d++) { | |
var e = this.getVector(d); | |
if ((e = this.grid.cellContent({ | |
x: b + e.x, | |
y: c + e.y | |
})) && e.value === a.value) | |
return !0 | |
} | |
return !1 | |
} | |
; | |
GameManager.prototype.positionsEqual = function(a, b) { | |
return a.x === b.x && a.y === b.y | |
} | |
; | |
window.requestAnimationFrame(function() { | |
new GameManager(4,KeyboardInputManager,HTMLActuator,LocalStorageManager) | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<script src="//cdnjs.cloudflare.com/ajax/libs/hammer.js/1.0.6/hammer.min.js"></script> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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; } | |
h1.title a { | |
text-decoration: none; } | |
@-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: #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"; } | |
.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; | |
-ms-touch-callout: none; | |
-webkit-user-select: none; | |
-moz-user-select: none; | |
-ms-user-select: none; | |
-ms-touch-action: none; | |
touch-action: none; | |
background: #bbada0; | |
border-radius: 6px; | |
width: 500px; | |
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; } | |
.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: 106.25px; | |
height: 106.25px; | |
margin-right: 15px; | |
float: left; | |
border-radius: 3px; | |
background: rgba(238, 228, 218, 0.35); } | |
.grid-cell:last-child { | |
margin-right: 0; } | |
.tile-container { | |
position: absolute; | |
z-index: 2; } | |
.tile, .tile .tile-inner { | |
width: 107px; | |
height: 107px; | |
line-height: 116.25px; } | |
.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, 121px); | |
-moz-transform: translate(0px, 121px); | |
transform: translate(0px, 121px); } | |
.tile.tile-position-1-3 { | |
-webkit-transform: translate(0px, 242px); | |
-moz-transform: translate(0px, 242px); | |
transform: translate(0px, 242px); } | |
.tile.tile-position-1-4 { | |
-webkit-transform: translate(0px, 363px); | |
-moz-transform: translate(0px, 363px); | |
transform: translate(0px, 363px); } | |
.tile.tile-position-2-1 { | |
-webkit-transform: translate(121px, 0px); | |
-moz-transform: translate(121px, 0px); | |
transform: translate(121px, 0px); } | |
.tile.tile-position-2-2 { | |
-webkit-transform: translate(121px, 121px); | |
-moz-transform: translate(121px, 121px); | |
transform: translate(121px, 121px); } | |
.tile.tile-position-2-3 { | |
-webkit-transform: translate(121px, 242px); | |
-moz-transform: translate(121px, 242px); | |
transform: translate(121px, 242px); } | |
.tile.tile-position-2-4 { | |
-webkit-transform: translate(121px, 363px); | |
-moz-transform: translate(121px, 363px); | |
transform: translate(121px, 363px); } | |
.tile.tile-position-3-1 { | |
-webkit-transform: translate(242px, 0px); | |
-moz-transform: translate(242px, 0px); | |
transform: translate(242px, 0px); } | |
.tile.tile-position-3-2 { | |
-webkit-transform: translate(242px, 121px); | |
-moz-transform: translate(242px, 121px); | |
transform: translate(242px, 121px); } | |
.tile.tile-position-3-3 { | |
-webkit-transform: translate(242px, 242px); | |
-moz-transform: translate(242px, 242px); | |
transform: translate(242px, 242px); } | |
.tile.tile-position-3-4 { | |
-webkit-transform: translate(242px, 363px); | |
-moz-transform: translate(242px, 363px); | |
transform: translate(242px, 363px); } | |
.tile.tile-position-4-1 { | |
-webkit-transform: translate(363px, 0px); | |
-moz-transform: translate(363px, 0px); | |
transform: translate(363px, 0px); } | |
.tile.tile-position-4-2 { | |
-webkit-transform: translate(363px, 121px); | |
-moz-transform: translate(363px, 121px); | |
transform: translate(363px, 121px); } | |
.tile.tile-position-4-3 { | |
-webkit-transform: translate(363px, 242px); | |
-moz-transform: translate(363px, 242px); | |
transform: translate(363px, 242px); } | |
.tile.tile-position-4-4 { | |
-webkit-transform: translate(363px, 363px); | |
-moz-transform: translate(363px, 363px); | |
transform: translate(363px, 363px); } | |
.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: #eee4da; | |
text-align: center; | |
font-weight: bold; | |
z-index: 10; | |
font-size: 55px; } | |
.tile.tile-2 .tile-inner { | |
background: url(https://walther.com/ourpages/auto/profiles/301053/images/WALTHERHS1507834179958_thumb.jpg); | |
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: url(https://walther.com/ourpages/auto/profiles/669676/images/WALTHERHS1507834031524_thumb.jpg); | |
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: url(https://walther.com/ourpages/auto/profiles/301055/images/WALTHERHS1507834251546_thumb.jpg); } | |
.tile.tile-16 .tile-inner { | |
color: #f9f6f2; | |
background: url(https://walther.com/ourpages/auto/profiles/813442/images/WALTHERHS1507833895947_thumb.jpg); } | |
.tile.tile-32 .tile-inner { | |
color: #f9f6f2; | |
background: url(https://walther.com/ourpages/auto/profiles/298418/images/WALTHERHS1507833406965_thumb.jpg); } | |
.tile.tile-64 .tile-inner { | |
color: #f9f6f2; | |
background: url(https://walther.com/ourpages/auto/profiles/299946/images/WALTHERHS1507833653071_thumb.jpg); } | |
.tile.tile-128 .tile-inner { | |
color: #f9f6f2; | |
background: url(https://walther.com/ourpages/auto/profiles/813434/images/WALTHERHS1507834062755_thumb.jpg); | |
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; } } | |
.tile.tile-256 .tile-inner { | |
color: #f9f6f2; | |
background: url(https://walther.com/ourpages/auto/profiles/857569/images/WALTHERHS1507833842283_thumb.jpg); | |
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; } } | |
.tile.tile-512 .tile-inner { | |
color: #f9f6f2; | |
background: url(https://walther.com/ourpages/auto/profiles/298437/images/WALTHERHS1418270347054_thumb.jpg); | |
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; } } | |
.tile.tile-1024 .tile-inner { | |
color: #f9f6f2; | |
background: url(https://walther.com/ourpages/auto/profiles/864477/images/WALTHERHS1507833745782_thumb.jpg); | |
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; } } | |
.tile.tile-2048 .tile-inner { | |
color: #f9f6f2; | |
background: url(https://walther.com/ourpages/auto/profiles/298420/images/WALTHERHS1507833544323_thumb.jpg); | |
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; } } | |
.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; } } | |
@-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; } | |
.above-game:after { | |
content: ""; | |
display: block; | |
clear: both; } | |
.game-intro { | |
float: left; | |
line-height: 42px; | |
margin-bottom: 0; } | |
.restart-button { | |
display: inline-block; | |
background: #8f7a66; | |
border-radius: 3px; | |
padding: 0 20px; | |
text-decoration: none; | |
color: #f9f6f2; | |
height: 40px; | |
line-height: 42px; | |
display: block; | |
text-align: center; | |
float: right; } | |
.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-intro { | |
width: 55%; | |
display: block; | |
box-sizing: border-box; | |
line-height: 1.65; } | |
.restart-button { | |
width: 42%; | |
padding: 0; | |
display: block; | |
box-sizing: border-box; | |
margin-top: 2px; } | |
.game-container { | |
margin-top: 17px; | |
position: relative; | |
padding: 10px; | |
cursor: default; | |
-webkit-touch-callout: none; | |
-ms-touch-callout: none; | |
-webkit-user-select: none; | |
-moz-user-select: none; | |
-ms-user-select: none; | |
-ms-touch-action: none; | |
touch-action: none; | |
background: #bbada0; | |
border-radius: 6px; | |
width: 280px; | |
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; } | |
.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: 57.5px; | |
height: 57.5px; | |
margin-right: 10px; | |
float: left; | |
border-radius: 3px; | |
background: rgba(238, 228, 218, 0.35); } | |
.grid-cell:last-child { | |
margin-right: 0; } | |
.tile-container { | |
position: absolute; | |
z-index: 2; } | |
.tile, .tile .tile-inner { | |
width: 58px; | |
height: 58px; | |
line-height: 67.5px; } | |
.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, 67px); | |
-moz-transform: translate(0px, 67px); | |
transform: translate(0px, 67px); } | |
.tile.tile-position-1-3 { | |
-webkit-transform: translate(0px, 135px); | |
-moz-transform: translate(0px, 135px); | |
transform: translate(0px, 135px); } | |
.tile.tile-position-1-4 { | |
-webkit-transform: translate(0px, 202px); | |
-moz-transform: translate(0px, 202px); | |
transform: translate(0px, 202px); } | |
.tile.tile-position-2-1 { | |
-webkit-transform: translate(67px, 0px); | |
-moz-transform: translate(67px, 0px); | |
transform: translate(67px, 0px); } | |
.tile.tile-position-2-2 { | |
-webkit-transform: translate(67px, 67px); | |
-moz-transform: translate(67px, 67px); | |
transform: translate(67px, 67px); } | |
.tile.tile-position-2-3 { | |
-webkit-transform: translate(67px, 135px); | |
-moz-transform: translate(67px, 135px); | |
transform: translate(67px, 135px); } | |
.tile.tile-position-2-4 { | |
-webkit-transform: translate(67px, 202px); | |
-moz-transform: translate(67px, 202px); | |
transform: translate(67px, 202px); } | |
.tile.tile-position-3-1 { | |
-webkit-transform: translate(135px, 0px); | |
-moz-transform: translate(135px, 0px); | |
transform: translate(135px, 0px); } | |
.tile.tile-position-3-2 { | |
-webkit-transform: translate(135px, 67px); | |
-moz-transform: translate(135px, 67px); | |
transform: translate(135px, 67px); } | |
.tile.tile-position-3-3 { | |
-webkit-transform: translate(135px, 135px); | |
-moz-transform: translate(135px, 135px); | |
transform: translate(135px, 135px); } | |
.tile.tile-position-3-4 { | |
-webkit-transform: translate(135px, 202px); | |
-moz-transform: translate(135px, 202px); | |
transform: translate(135px, 202px); } | |
.tile.tile-position-4-1 { | |
-webkit-transform: translate(202px, 0px); | |
-moz-transform: translate(202px, 0px); | |
transform: translate(202px, 0px); } | |
.tile.tile-position-4-2 { | |
-webkit-transform: translate(202px, 67px); | |
-moz-transform: translate(202px, 67px); | |
transform: translate(202px, 67px); } | |
.tile.tile-position-4-3 { | |
-webkit-transform: translate(202px, 135px); | |
-moz-transform: translate(202px, 135px); | |
transform: translate(202px, 135px); } | |
.tile.tile-position-4-4 { | |
-webkit-transform: translate(202px, 202px); | |
-moz-transform: translate(202px, 202px); | |
transform: translate(202px, 202px); } | |
.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; } } | |
.right { | |
float: right; } | |
.left { | |
float: left; } | |
.clearfix { | |
clear: both; } | |
.play-now { | |
margin-top: 22px; } | |
.play-now a { | |
border-radius: 6px; | |
padding: 12px; | |
text-decoration: none; | |
background-color: #bbada0; | |
color: white; } | |
.play-now a:hover { | |
text-decoration: underline; } | |
body { | |
margin: 30px 0; | |
margin-top: 0px; | |
margin-bottom: 0px; | |
padding-top: 15px; | |
position: relative; } | |
footer { | |
padding-bottom: 30px; } | |
p { | |
line-height: 1.45; } | |
.heading { | |
margin-bottom: 20px; } | |
.side-column { | |
background-image: url(/img/pattern/amam.png); | |
background-position: 0px 0px; | |
background-repeat: repeat-y; | |
width: 180px; | |
height: 100%; | |
position: absolute; | |
top: 0; | |
bottom: 0; } | |
.side-column-left { | |
left: 0; | |
border-right: 1px solid white; } | |
.side-column-right { | |
right: 0; | |
border-left: 1px solid white; | |
background-position: -19px 0px; } | |
.side-ad { | |
margin-top: 360px; | |
margin-left: 10px; } | |
@media (min-height: 769px) { | |
.side-ad { | |
margin-top: 400px; } } | |
.side-ad .sponsored { | |
text-transform: uppercase; | |
font-size: 10px; } | |
.game-container { | |
margin-top: 25px; } | |
.grammarly-box { | |
padding: 20px; | |
background: #fff; | |
margin-bottom: 30px; | |
border: solid 1px #eee; | |
border-top: solid 2px #F08150; } | |
.grammarly-box .caption { | |
font-size: 18px; | |
line-height: 25px; | |
margin-bottom: 10px; | |
display: inline-block; } | |
.grammarly-box p { | |
margin-bottom: 0; | |
line-height: 1.3; | |
font-size: 14px; } | |
.bold { | |
font-weight: bold; } | |
.box-shadow { | |
background: #fff; | |
position: relative; } | |
.box-shadow:after, | |
.box-shadow:before { | |
top: 80%; | |
left: 5px; | |
width: 50%; | |
z-index: -1; | |
content: ""; | |
bottom: 15px; | |
max-width: 300px; | |
background: #999; | |
position: absolute; } | |
.shadow-effect { | |
position: relative; } | |
.shadow-effect:after, .shadow-effect:before { | |
transform: rotate(-3deg); | |
-o-transform: rotate(-3deg); | |
-ms-transform: rotate(-3deg); | |
-moz-transform: rotate(-3deg); | |
-webkit-transform: rotate(-3deg); | |
box-shadow: 0 15px 10px #999; | |
-moz-box-shadow: 0 15px 10px #999; | |
-webkit-box-shadow: 0 15px 10px #999; } | |
.shadow-effect:after { | |
left: auto; | |
right: 5px; | |
transform: rotate(3deg); | |
-o-transform: rotate(3deg); | |
-ms-transform: rotate(3deg); | |
-moz-transform: rotate(3deg); | |
-webkit-transform: rotate(3deg); } | |
.top-link-ads-wrapper { | |
border-bottom: 1px solid #D7C7B9; | |
padding: 4px; | |
margin-bottom: 15px; } | |
.top-link-ads { | |
height: 15px; } | |
.text-center { | |
text-align: center; } | |
h2.subtitle { | |
font-size: 1em; | |
margin: 0; } | |
.game-intro { | |
line-height: inherit; | |
float: none; | |
width: 100% !important; } | |
.game-explanation { | |
margin-top: 0px; } | |
.focus-line { | |
background-color: #ffc; | |
text-align: center; | |
padding: 5px 0; } | |
.ads-button { | |
margin-top: 15px; | |
margin-bottom: 10px; } | |
.fb-line { | |
margin-bottom: 20px; | |
float: right; | |
width: 160px; } | |
.fb-line .game-explanation { | |
font-size: 14px; | |
margin-bottom: 20px; | |
text-align: justify; } | |
.fb-line p { | |
margin-bottom: 0px; | |
float: none; } | |
.fb-line .fb-like-wrapper { | |
height: 30px; } | |
.ads-bellow-game { | |
margin-bottom: 20px; | |
height: 250px; | |
overflow: hidden; | |
float: left; } | |
.share-img-container { | |
padding-right: 25px; } | |
.share-img { | |
display: inline-block; } | |
.share-img-small { | |
display: none; } | |
.facebook-share-button { | |
color: #394F9F; | |
font-size: 14px; | |
display: block; | |
float: left; } | |
.twitter-button-wrapper { | |
float: left; | |
font-size: 14px; | |
margin-right: 10px; | |
width: 61px; } | |
.unstyled { | |
margin: 0px; | |
padding-left: 0px; } | |
.unstyled li { | |
list-style: none; } | |
h1.title-internal { | |
font-size: 40px; } | |
.shop-learn-more { | |
padding: 10px 0px; | |
border: 1px solid #d8d4d0; | |
text-align: center; | |
display: block; } | |
.shop-learn-more:hover { | |
background-color: #d8d4d0; } | |
.tips-and-tricks { | |
clear: both; } | |
.tips-and-tricks li { | |
margin-bottom: 10px; | |
margin-right: 10px; | |
float: left; | |
border: 1px solid #d8d4d0; } | |
.tips-and-tricks li a { | |
display: inline-block; | |
padding: 10px 0px; | |
width: 242px; | |
text-align: center; } | |
.tips-and-tricks li a:hover { | |
background-color: #d8d4d0; } | |
.tips-and-tricks li.even { | |
margin-right: 0px; } | |
.shop-list .item-link img { | |
width: 195px; | |
height: 195px; } | |
.shop-list .item-link .title { | |
margin: 5px 0; } | |
.quotes .quote { | |
margin-bottom: 20px; } | |
.iframe-main { | |
position: absolute; | |
background: transparent; | |
width: 100%; | |
height: 100%; | |
top: 50px; | |
padding: 0; } | |
.score-sharing { | |
display: inline-block; | |
margin-left: 10px; } | |
footer { | |
font-size: 17px; } | |
#flappy-thirds-wrapper { | |
text-align: center; } | |
#flappy-thirds-wrapper canvas { | |
border: 1px solid #d8d4d0; } | |
.choose-language, .solitaire-ad { | |
text-decoration: none; | |
font-size: 14px; | |
margin-left: 10px; } | |
.solitaire-ad { | |
padding-left: 5px; } | |
.solitaire-ad img { | |
margin-left: 15px; } | |
/* patch flag icons */ | |
.choose-language span.flag-icon { | |
border: 1px solid #776e65; } | |
.flag-icon-en { | |
background-image: url(../flags/4x3/us.svg); } | |
.mobile-top { | |
position: relative; | |
display: none; | |
margin-bottom: 15px; | |
color: #f9f6f2; } | |
.mobile-top .open { | |
background-color: #776e65; | |
padding: 10px 0; } | |
.mobile-top .closed { | |
display: none; | |
height: 20px; } | |
.mobile-top .ad { | |
width: 320px; | |
height: 100px; | |
margin: 0 auto; | |
background-color: white; } | |
.mobile-top .close-btn { | |
position: absolute; | |
top: 5px; | |
right: 10px; | |
color: white; | |
text-decoration: none; } | |
.mobile-top-alt { | |
display: none; } | |
@media screen and (max-width: 860px) { | |
.side-column { | |
width: 130px; } | |
.side-ad { | |
display: none; } | |
.solitaire-ad img { | |
width: 100px; } | |
.side-column-left { | |
background-position: -60px 0px; } } | |
@media screen and (max-width: 760px) { | |
.side-column { | |
display: none; } | |
.mobile-top { | |
display: block; } | |
body { | |
padding: 0px; } } | |
@media screen and (min-width: 481px) { | |
.tile .tile-inner { | |
line-height: 107px; } | |
h1.title { | |
font-size: 74px; | |
line-height: 66px; } } | |
@media screen and (max-height: 768px) and (min-width: 481px) { | |
.heading { | |
margin-bottom: 15px; } | |
h1.title-internal { | |
font-size: 40px; | |
line-height: 64px; } | |
.container { | |
width: 450px; } | |
.game-container { | |
margin-top: 40px; | |
position: relative; | |
padding: 12px; | |
cursor: default; | |
-webkit-touch-callout: none; | |
-ms-touch-callout: none; | |
-webkit-user-select: none; | |
-moz-user-select: none; | |
-ms-user-select: none; | |
-ms-touch-action: none; | |
touch-action: none; | |
background: #bbada0; | |
border-radius: 6px; | |
width: 450px; | |
height: 450px; | |
-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; } | |
.grid-container { | |
position: absolute; | |
z-index: 1; } | |
.grid-row { | |
margin-bottom: 12px; } | |
.grid-row:last-child { | |
margin-bottom: 0; } | |
.grid-row:after { | |
content: ""; | |
display: block; | |
clear: both; } | |
.grid-cell { | |
width: 97.5px; | |
height: 97.5px; | |
margin-right: 12px; | |
float: left; | |
border-radius: 3px; | |
background: rgba(238, 228, 218, 0.35); } | |
.grid-cell:last-child { | |
margin-right: 0; } | |
.tile-container { | |
position: absolute; | |
z-index: 2; } | |
.tile, .tile .tile-inner { | |
width: 98px; | |
height: 98px; | |
line-height: 107.5px; } | |
.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, 109px); | |
-moz-transform: translate(0px, 109px); | |
transform: translate(0px, 109px); } | |
.tile.tile-position-1-3 { | |
-webkit-transform: translate(0px, 219px); | |
-moz-transform: translate(0px, 219px); | |
transform: translate(0px, 219px); } | |
.tile.tile-position-1-4 { | |
-webkit-transform: translate(0px, 328px); | |
-moz-transform: translate(0px, 328px); | |
transform: translate(0px, 328px); } | |
.tile.tile-position-2-1 { | |
-webkit-transform: translate(109px, 0px); | |
-moz-transform: translate(109px, 0px); | |
transform: translate(109px, 0px); } | |
.tile.tile-position-2-2 { | |
-webkit-transform: translate(109px, 109px); | |
-moz-transform: translate(109px, 109px); | |
transform: translate(109px, 109px); } | |
.tile.tile-position-2-3 { | |
-webkit-transform: translate(109px, 219px); | |
-moz-transform: translate(109px, 219px); | |
transform: translate(109px, 219px); } | |
.tile.tile-position-2-4 { | |
-webkit-transform: translate(109px, 328px); | |
-moz-transform: translate(109px, 328px); | |
transform: translate(109px, 328px); } | |
.tile.tile-position-3-1 { | |
-webkit-transform: translate(219px, 0px); | |
-moz-transform: translate(219px, 0px); | |
transform: translate(219px, 0px); } | |
.tile.tile-position-3-2 { | |
-webkit-transform: translate(219px, 109px); | |
-moz-transform: translate(219px, 109px); | |
transform: translate(219px, 109px); } | |
.tile.tile-position-3-3 { | |
-webkit-transform: translate(219px, 219px); | |
-moz-transform: translate(219px, 219px); | |
transform: translate(219px, 219px); } | |
.tile.tile-position-3-4 { | |
-webkit-transform: translate(219px, 328px); | |
-moz-transform: translate(219px, 328px); | |
transform: translate(219px, 328px); } | |
.tile.tile-position-4-1 { | |
-webkit-transform: translate(328px, 0px); | |
-moz-transform: translate(328px, 0px); | |
transform: translate(328px, 0px); } | |
.tile.tile-position-4-2 { | |
-webkit-transform: translate(328px, 109px); | |
-moz-transform: translate(328px, 109px); | |
transform: translate(328px, 109px); } | |
.tile.tile-position-4-3 { | |
-webkit-transform: translate(328px, 219px); | |
-moz-transform: translate(328px, 219px); | |
transform: translate(328px, 219px); } | |
.tile.tile-position-4-4 { | |
-webkit-transform: translate(328px, 328px); | |
-moz-transform: translate(328px, 328px); | |
transform: translate(328px, 328px); } | |
.tile .tile-inner { | |
font-size: 53px; | |
line-height: 98px; } | |
.tile-128 .tile-inner, .tile-256 .tile-inner, .tile-512 .tile-inner { | |
font-size: 43px !important; } | |
.tile-1024 .tile-inner, .tile-2048 .tile-inner { | |
font-size: 33px !important; } | |
.game-intro { | |
font-size: 17px; } | |
.restart-button { | |
padding: 0 14px; } | |
.game-container { | |
margin-top: 10px; } | |
.tips-and-tricks li a { | |
width: 218px; } | |
footer { | |
font-size: 16px; } } | |
@media screen and (max-width: 480px) { | |
html, body { | |
font-size: 15px; } | |
body { | |
margin: 0 0 20px 0; } | |
#flappy-thirds-wrapper canvas { | |
width: 100%; } | |
.restart-button { | |
width: 35%; } | |
.game-container { | |
margin-top: 10px; } | |
.score-container:after, .best-container:after { | |
font-size: 11px; } | |
.approved img { | |
width: 280px; } | |
.play-now a { | |
padding: 8px; } | |
h1.title-internal { | |
font-size: 24px; } | |
.share-img { | |
display: none; } | |
.share-img-small { | |
display: none; } | |
.tips-and-tricks li a { | |
width: 280px; } | |
.tips-and-tricks li a.even { | |
margin-right: 0px; } | |
.top-link-ads-wrapper { | |
display: none; } | |
.fb-line { | |
float: left; | |
width: 100%; | |
font-size: 15px; } | |
.ads-bellow-game { | |
margin-top: 30px; | |
text-align: center; | |
float: none; | |
width: 100%; } } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment