{"project":{"id":"gzhbcu6","userId":"davidyarham@gmail.com","username":null,"userPicture":null,"name":"Klondike Solitaire","thumbnail":"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","visible":true,"contributors":"","githubRepo":null,"forkedFrom":null,"tags":"","files":{"folder":"","files":[{"name":"index.html","content":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Untitled</title>\n  <link rel=\"stylesheet\" href=\"style.css\">\n<link rel=\"stylesheet\" href=\"https://unpkg.com/lucide-static@latest/font/lucide.min.css\">\n<script src=\"https://unpkg.com/lucide@latest/dist/umd/lucide.js\"></script>\n</head>\n<body>\n<div class=\"solitaire\">\n\t<header class=\"solitaire__header\">\n\t\t<div class=\"solitaire__brand\">\n\t\t\t<i data-lucide=\"spade\" class=\"solitaire__icon\"></i>\n\t\t\t<h1 class=\"solitaire__title\">Klondike</h1>\n\t\t</div>\n\t\t<div class=\"solitaire__stats\">\n\t\t\t<div class=\"solitaire__stat\">\n\t\t\t\t<span class=\"solitaire__stat-label\">Moves</span>\n\t\t\t\t<span class=\"solitaire__stat-value\" id=\"moveCount\">0</span>\n\t\t\t</div>\n\t\t\t<div class=\"solitaire__stat\">\n\t\t\t\t<span class=\"solitaire__stat-label\">Time</span>\n\t\t\t\t<span class=\"solitaire__stat-value\" id=\"timer\">0:00</span>\n\t\t\t</div>\n\t\t\t<div class=\"solitaire__stat\">\n\t\t\t\t<span class=\"solitaire__stat-label\">Score</span>\n\t\t\t\t<span class=\"solitaire__stat-value\" id=\"score\">0</span>\n\t\t\t</div>\n\t\t</div>\n\t\t<button class=\"solitaire__new-game solitaire__auto-btn\" id=\"autoPlayBtn\">\n      <i data-lucide=\"zap\"></i>\n      Auto\n    </button>\n\t\t<button class=\"solitaire__new-game\" id=\"newGameBtn\">\n      <i data-lucide=\"rotate-ccw\"></i>\n      New Deal\n    </button>\n\t</header>\n\n\t<div class=\"solitaire__board\" id=\"board\">\n\t\t<div class=\"solitaire__top-row\">\n\t\t\t<div class=\"solitaire__stock-waste\">\n\t\t\t\t<div class=\"card-zone card-zone--stock\" id=\"stock\" data-zone=\"stock\">\n\t\t\t\t\t<div class=\"card-zone__label\">Stock</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"card-zone card-zone--waste\" id=\"waste\" data-zone=\"waste\">\n\t\t\t\t\t<div class=\"card-zone__label\">Waste</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"solitaire__foundations\">\n\t\t\t\t<div class=\"card-zone card-zone--foundation\" id=\"foundation-0\" data-zone=\"foundation\" data-index=\"0\">\n\t\t\t\t\t<span class=\"card-zone__suit\">♠</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"card-zone card-zone--foundation\" id=\"foundation-1\" data-zone=\"foundation\" data-index=\"1\">\n\t\t\t\t\t<span class=\"card-zone__suit\">♥</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"card-zone card-zone--foundation\" id=\"foundation-2\" data-zone=\"foundation\" data-index=\"2\">\n\t\t\t\t\t<span class=\"card-zone__suit\">♦</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"card-zone card-zone--foundation\" id=\"foundation-3\" data-zone=\"foundation\" data-index=\"3\">\n\t\t\t\t\t<span class=\"card-zone__suit\">♣</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"solitaire__tableau\">\n\t\t\t<div class=\"card-zone card-zone--tableau\" id=\"tableau-0\" data-zone=\"tableau\" data-index=\"0\"></div>\n\t\t\t<div class=\"card-zone card-zone--tableau\" id=\"tableau-1\" data-zone=\"tableau\" data-index=\"1\"></div>\n\t\t\t<div class=\"card-zone card-zone--tableau\" id=\"tableau-2\" data-zone=\"tableau\" data-index=\"2\"></div>\n\t\t\t<div class=\"card-zone card-zone--tableau\" id=\"tableau-3\" data-zone=\"tableau\" data-index=\"3\"></div>\n\t\t\t<div class=\"card-zone card-zone--tableau\" id=\"tableau-4\" data-zone=\"tableau\" data-index=\"4\"></div>\n\t\t\t<div class=\"card-zone card-zone--tableau\" id=\"tableau-5\" data-zone=\"tableau\" data-index=\"5\"></div>\n\t\t\t<div class=\"card-zone card-zone--tableau\" id=\"tableau-6\" data-zone=\"tableau\" data-index=\"6\"></div>\n\t\t</div>\n\t</div>\n\n\t<div class=\"solitaire__win-overlay\" id=\"winOverlay\">\n\t\t<div class=\"solitaire__win-card\">\n\t\t\t<h2 class=\"solitaire__win-title\">You Win!</h2>\n\t\t\t<div class=\"solitaire__win-stats\">\n\t\t\t\t<div><span>Moves:</span> <strong id=\"winMoves\">0</strong></div>\n\t\t\t\t<div><span>Time:</span> <strong id=\"winTime\">0:00</strong></div>\n\t\t\t\t<div><span>Score:</span> <strong id=\"winScore\">0</strong></div>\n\t\t\t</div>\n\t\t\t<button class=\"solitaire__new-game\" id=\"winNewGame\">Deal Again</button>\n\t\t</div>\n\t</div>\n</div>\n  <script type=\"module\" src=\"main.js\"></script>\n</body>\n</html>"},{"name":"main.js","content":"const SUITS = ['♠', '♥', '♦', '♣'];\nconst SUIT_NAMES = ['spades', 'hearts', 'diamonds', 'clubs'];\nconst RANKS = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'];\nconst RED_SUITS = ['♥', '♦'];\n\nlet state = {\n\tstock: [],\n\twaste: [],\n\tfoundations: [\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[]\n\t],\n\ttableau: [\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[]\n\t],\n\tmoves: 0,\n\tscore: 0,\n\ttime: 0,\n\ttimerInterval: null,\n\tgameStarted: false,\n\tdragging: null\n};\n\nfunction createDeck() {\n\tconst deck = [];\n\tfor (let s = 0; s < 4; s++) {\n\t\tfor (let r = 0; r < 13; r++) {\n\t\t\tdeck.push({\n\t\t\t\tsuit: SUITS[s],\n\t\t\t\tsuitName: SUIT_NAMES[s],\n\t\t\t\trank: RANKS[r],\n\t\t\t\tvalue: r,\n\t\t\t\tisRed: RED_SUITS.includes(SUITS[s]),\n\t\t\t\tfaceUp: false,\n\t\t\t\tid: `${RANKS[r]}-${SUIT_NAMES[s]}`\n\t\t\t});\n\t\t}\n\t}\n\treturn deck;\n}\n\nfunction shuffle(arr) {\n\tfor (let i = arr.length - 1; i > 0; i--) {\n\t\tconst j = Math.floor(Math.random() * (i + 1));\n\t\t[arr[i], arr[j]] = [arr[j], arr[i]];\n\t}\n\treturn arr;\n}\n\nfunction getDealIndex(col, row) {\n\tlet index = 0;\n\tfor (let r = 0; r < row; r++) index += (7 - r);\n\treturn index + (col - row);\n}\n\nfunction deal() {\n\tconst deck = shuffle(createDeck());\n\tstate.tableau = [\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[]\n\t];\n\tstate.foundations = [\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[]\n\t];\n\tstate.waste = [];\n\tstate.moves = 0;\n\tstate.score = 0;\n\tstate.time = 0;\n\tstate.gameStarted = false;\n\tclearInterval(state.timerInterval);\n\tdocument.getElementById('timer').textContent = '0:00';\n\tdocument.getElementById('moveCount').textContent = '0';\n\tdocument.getElementById('score').textContent = '0';\n\tdocument.getElementById('winOverlay').classList.remove('solitaire__win-overlay--visible');\n\n\tlet idx = 0;\n\tfor (let col = 0; col < 7; col++) {\n\t\tfor (let row = 0; row <= col; row++) {\n\t\t\tconst card = deck[idx++];\n\t\t\tcard.faceUp = row === col;\n\t\t\tstate.tableau[col].push(card);\n\t\t}\n\t}\n\tstate.stock = deck.slice(idx).reverse();\n\tstate.dealing = true;\n\trender();\n\tsetTimeout(() => {\n\t\tstate.dealing = false;\n\t}, 2400);\n}\n\nfunction startTimer() {\n\tif (state.gameStarted) return;\n\tstate.gameStarted = true;\n\tstate.timerInterval = setInterval(() => {\n\t\tstate.time++;\n\t\tconst m = Math.floor(state.time / 60);\n\t\tconst s = state.time % 60;\n\t\tdocument.getElementById('timer').textContent = `${m}:${s.toString().padStart(2, '0')}`;\n\t}, 1000);\n}\n\nfunction addScore(pts) {\n\tstate.score = Math.max(0, state.score + pts);\n\tdocument.getElementById('score').textContent = state.score;\n}\n\nfunction addMove() {\n\tstate.moves++;\n\tdocument.getElementById('moveCount').textContent = state.moves;\n}\n\nfunction createCardEl(card, stackIndex, totalInStack) {\n\tconst el = document.createElement('div');\n\tel.className = `card ${card.faceUp ? 'card--face-up' : 'card--face-down'}`;\n\tif (card.faceUp) {\n\t\tel.classList.add(card.isRed ? 'card--red' : 'card--black');\n\t\tel.innerHTML = `\n      <div class=\"card__corner card__corner--top\">\n        <span class=\"card__rank\">${card.rank}</span>\n        <span class=\"card__suit\">${card.suit}</span>\n      </div>\n      <span class=\"card__center-suit\">${card.suit}</span>\n      <div class=\"card__corner card__corner--bottom\">\n        <span class=\"card__rank\">${card.rank}</span>\n        <span class=\"card__suit\">${card.suit}</span>\n      </div>\n    `;\n\t}\n\tel.dataset.cardId = card.id;\n\tel.style.setProperty('--z', stackIndex + 1);\n\treturn el;\n}\n\nfunction render() {\n\t// Stock\n\tconst stockEl = document.getElementById('stock');\n\tstockEl.querySelectorAll('.card').forEach(c => c.remove());\n\tif (state.stock.length > 0) {\n\t\tstockEl.classList.remove('card-zone--empty');\n\t\tconst cardEl = document.createElement('div');\n\t\tcardEl.className = 'card card--face-down';\n\t\tif (state.dealing) {\n\t\t\tcardEl.classList.add('card--deal-stock');\n\t\t\tcardEl.style.setProperty('--deal-delay', '0ms');\n\t\t}\n\t\tcardEl.style.setProperty('--z', 1);\n\t\tstockEl.appendChild(cardEl);\n\t} else {\n\t\tstockEl.classList.add('card-zone--empty');\n\t}\n\n\t// Waste\n\tconst wasteEl = document.getElementById('waste');\n\twasteEl.querySelectorAll('.card').forEach(c => c.remove());\n\tif (state.waste.length > 0) {\n\t\tconst card = state.waste[state.waste.length - 1];\n\t\tconst cardEl = createCardEl(card, 0, 1);\n\t\twasteEl.appendChild(cardEl);\n\t}\n\n\t// Foundations\n\tfor (let i = 0; i < 4; i++) {\n\t\tconst fEl = document.getElementById(`foundation-${i}`);\n\t\tfEl.querySelectorAll('.card').forEach(c => c.remove());\n\t\tconst pile = state.foundations[i];\n\t\tif (pile.length > 0) {\n\t\t\tconst card = pile[pile.length - 1];\n\t\t\tconst cardEl = createCardEl(card, 0, 1);\n\t\t\tfEl.appendChild(cardEl);\n\t\t}\n\t}\n\n\t// Tableau\n\tfor (let col = 0; col < 7; col++) {\n\t\tconst tEl = document.getElementById(`tableau-${col}`);\n\t\ttEl.querySelectorAll('.card').forEach(c => c.remove());\n\t\tconst pile = state.tableau[col];\n\t\tpile.forEach((card, idx) => {\n\t\t\tconst cardEl = createCardEl(card, idx, pile.length);\n\t\t\tconst offset = card.faceUp ?\n\t\t\t\tpile.slice(0, idx).reduce((sum, c) => sum + (c.faceUp ? 1 : 0.4), 0) :\n\t\t\t\tpile.slice(0, idx).filter(c => !c.faceUp).length * 0.4;\n\t\t\tcardEl.style.setProperty('--top', `calc(var(--stack-offset) * ${offset.toFixed(2)})`);\n\t\t\tif (state.dealing) {\n\t\t\t\tconst dealIdx = getDealIndex(col, idx);\n\t\t\t\tcardEl.classList.add('card--dealing');\n\t\t\t\tcardEl.style.setProperty('--deal-delay', `${dealIdx * 70}ms`);\n\t\t\t}\n\t\t\ttEl.appendChild(cardEl);\n\t\t});\n\t}\n}\n\nfunction findCard(cardId) {\n\tfor (let col = 0; col < 7; col++) {\n\t\tconst idx = state.tableau[col].findIndex(c => c.id === cardId);\n\t\tif (idx !== -1) return {\n\t\t\tzone: 'tableau',\n\t\t\tindex: col,\n\t\t\tcardIndex: idx\n\t\t};\n\t}\n\tif (state.waste.length && state.waste[state.waste.length - 1].id === cardId) {\n\t\treturn {\n\t\t\tzone: 'waste',\n\t\t\tindex: 0,\n\t\t\tcardIndex: state.waste.length - 1\n\t\t};\n\t}\n\tfor (let i = 0; i < 4; i++) {\n\t\tconst pile = state.foundations[i];\n\t\tif (pile.length && pile[pile.length - 1].id === cardId) {\n\t\t\treturn {\n\t\t\t\tzone: 'foundation',\n\t\t\t\tindex: i,\n\t\t\t\tcardIndex: pile.length - 1\n\t\t\t};\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction getCards(loc) {\n\tif (loc.zone === 'tableau') return state.tableau[loc.index].slice(loc.cardIndex);\n\tif (loc.zone === 'waste') return [state.waste[state.waste.length - 1]];\n\tif (loc.zone === 'foundation') return [state.foundations[loc.index][state.foundations[loc.index].length - 1]];\n\treturn [];\n}\n\nfunction canPlaceOnTableau(cards, targetCol) {\n\tconst pile = state.tableau[targetCol];\n\tconst movingCard = cards[0];\n\tif (pile.length === 0) {\n\t\treturn movingCard.value === 12; // King\n\t}\n\tconst topCard = pile[pile.length - 1];\n\tif (!topCard.faceUp) return false;\n\treturn topCard.isRed !== movingCard.isRed && topCard.value === movingCard.value + 1;\n}\n\nfunction canPlaceOnFoundation(card, foundationIdx) {\n\tconst pile = state.foundations[foundationIdx];\n\tif (pile.length === 0) {\n\t\treturn card.value === 0; // Ace\n\t}\n\tconst topCard = pile[pile.length - 1];\n\treturn topCard.suit === card.suit && topCard.value === card.value - 1;\n}\n\nfunction moveCards(from, toZone, toIndex) {\n\tstartTimer();\n\tconst cards = getCards(from);\n\tif (cards.length === 0) return false;\n\n\tif (toZone === 'tableau') {\n\t\tif (!canPlaceOnTableau(cards, toIndex)) return false;\n\t\t// Remove from source\n\t\tif (from.zone === 'tableau') {\n\t\t\tstate.tableau[from.index].splice(from.cardIndex);\n\t\t\tflipTopCard(from.index);\n\t\t\tif (from.index !== toIndex) addScore(5);\n\t\t} else if (from.zone === 'waste') {\n\t\t\tstate.waste.pop();\n\t\t\taddScore(5);\n\t\t} else if (from.zone === 'foundation') {\n\t\t\tstate.foundations[from.index].pop();\n\t\t\taddScore(-15);\n\t\t}\n\t\tstate.tableau[toIndex].push(...cards);\n\t\taddMove();\n\t\tSFX.drop();\n\t\trender();\n\t\treturn true;\n\t}\n\n\tif (toZone === 'foundation' && cards.length === 1) {\n\t\tif (!canPlaceOnFoundation(cards[0], toIndex)) return false;\n\t\tif (from.zone === 'tableau') {\n\t\t\tstate.tableau[from.index].splice(from.cardIndex);\n\t\t\tflipTopCard(from.index);\n\t\t} else if (from.zone === 'waste') {\n\t\t\tstate.waste.pop();\n\t\t} else if (from.zone === 'foundation') {\n\t\t\tstate.foundations[from.index].pop();\n\t\t}\n\t\tstate.foundations[toIndex].push(cards[0]);\n\t\taddMove();\n\t\taddScore(10);\n\t\tSFX.foundation();\n\t\trender();\n\t\tcheckWin();\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction flipTopCard(col) {\n\tconst pile = state.tableau[col];\n\tif (pile.length > 0 && !pile[pile.length - 1].faceUp) {\n\t\tpile[pile.length - 1].faceUp = true;\n\t\taddScore(5);\n\t\tSFX.flip();\n\t}\n}\n\nfunction drawFromStock() {\n\tstartTimer();\n\tif (state.stock.length === 0) {\n\t\tif (state.waste.length === 0) return;\n\t\tstate.stock = state.waste.reverse();\n\t\tstate.stock.forEach(c => c.faceUp = false);\n\t\tstate.waste = [];\n\t\taddScore(-20);\n\t\tSFX.recycle();\n\t} else {\n\t\tconst card = state.stock.pop();\n\t\tcard.faceUp = true;\n\t\tstate.waste.push(card);\n\t\tSFX.draw();\n\t}\n\taddMove();\n\trender();\n}\n\nfunction tryAutoFoundation(cardId) {\n\tconst loc = findCard(cardId);\n\tif (!loc) return false;\n\tconst cards = getCards(loc);\n\tif (cards.length !== 1) return false;\n\tconst card = cards[0];\n\n\tfor (let i = 0; i < 4; i++) {\n\t\tif (canPlaceOnFoundation(card, i)) {\n\t\t\treturn moveCards(loc, 'foundation', i);\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction checkWin() {\n\tconst total = state.foundations.reduce((sum, f) => sum + f.length, 0);\n\tif (total === 52) {\n\t\tclearInterval(state.timerInterval);\n\t\tdocument.getElementById('winMoves').textContent = state.moves;\n\t\tdocument.getElementById('winTime').textContent = document.getElementById('timer').textContent;\n\t\tdocument.getElementById('winScore').textContent = state.score;\n\t\tSFX.win();\n\t\tsetTimeout(() => {\n\t\t\tdocument.getElementById('winOverlay').classList.add('solitaire__win-overlay--visible');\n\t\t}, 300);\n\t}\n}\n\n// Drag and drop\nlet dragState = null;\n\nfunction getCardElement(target) {\n\treturn target.closest('.card--face-up');\n}\n\nfunction getZoneElement(target) {\n\treturn target.closest('[data-zone]');\n}\n\nconst board = document.getElementById('board');\n\nboard.addEventListener('mousedown', handleDragStart);\nboard.addEventListener('touchstart', handleDragStart, {\n\tpassive: false\n});\n\nfunction handleDragStart(e) {\n\tconst touch = e.touches ? e.touches[0] : e;\n\tconst cardEl = getCardElement(touch.target || e.target);\n\tif (!cardEl) return;\n\n\tconst cardId = cardEl.dataset.cardId;\n\tconst loc = findCard(cardId);\n\tif (!loc) return;\n\n\tconst cards = getCards(loc);\n\tif (cards.length === 0) return;\n\n\t// Collect card elements to drag\n\tconst zoneEl = cardEl.closest('[data-zone]');\n\tconst allCards = [...zoneEl.querySelectorAll('.card')];\n\tconst cardIdx = allCards.indexOf(cardEl);\n\tconst dragEls = allCards.slice(cardIdx).filter(el => el.classList.contains('card--face-up'));\n\n\tif (dragEls.length === 0) return;\n\tif (e.touches) e.preventDefault();\n\n\tconst rect = cardEl.getBoundingClientRect();\n\tconst offsetX = touch.clientX - rect.left;\n\tconst offsetY = touch.clientY - rect.top;\n\n\tdragState = {\n\t\tloc,\n\t\tcards,\n\t\telements: dragEls,\n\t\toffsetX,\n\t\toffsetY,\n\t\tstartX: touch.clientX,\n\t\tstartY: touch.clientY,\n\t\tmoved: false,\n\t\toriginalPositions: dragEls.map(el => ({\n\t\t\tparent: el.parentElement,\n\t\t\ttop: el.style.getPropertyValue('--top'),\n\t\t\tz: el.style.getPropertyValue('--z')\n\t\t}))\n\t};\n\n\tdragEls.forEach((el, i) => {\n\t\tif (i === 0) el.classList.add('card--dragging');\n\t\telse el.classList.add('card--dragging-child');\n\t});\n\n\tdocument.addEventListener('mousemove', handleDragMove);\n\tdocument.addEventListener('touchmove', handleDragMove, {\n\t\tpassive: false\n\t});\n\tdocument.addEventListener('mouseup', handleDragEnd);\n\tdocument.addEventListener('touchend', handleDragEnd);\n}\n\nfunction handleDragMove(e) {\n\tif (!dragState) return;\n\tif (e.touches) e.preventDefault();\n\tconst touch = e.touches ? e.touches[0] : e;\n\n\tconst dx = touch.clientX - dragState.startX;\n\tconst dy = touch.clientY - dragState.startY;\n\n\tif (!dragState.moved && Math.abs(dx) < 3 && Math.abs(dy) < 3) return;\n\tdragState.moved = true;\n\n\tdragState.elements.forEach((el, i) => {\n\t\tconst origRect = dragState.originalPositions[i];\n\t\tel.style.position = 'fixed';\n\t\tel.style.left = `${touch.clientX - dragState.offsetX}px`;\n\t\tel.style.top = `${touch.clientY - dragState.offsetY + i * 25}px`;\n\t\tel.style.setProperty('--z', 10000 + i);\n\t\tel.style.setProperty('--top', '0px');\n\t});\n\n\t// Highlight drop targets\n\tdocument.querySelectorAll('.card-zone--highlight').forEach(el => el.classList.remove('card-zone--highlight'));\n\tconst elemBelow = document.elementFromPoint(touch.clientX, touch.clientY);\n\tif (elemBelow) {\n\t\tconst zone = elemBelow.closest('[data-zone]');\n\t\tif (zone) {\n\t\t\tconst zType = zone.dataset.zone;\n\t\t\tconst zIdx = parseInt(zone.dataset.index);\n\t\t\tlet valid = false;\n\t\t\tif (zType === 'tableau') valid = canPlaceOnTableau(dragState.cards, zIdx);\n\t\t\telse if (zType === 'foundation' && dragState.cards.length === 1) valid = canPlaceOnFoundation(dragState.cards[0], zIdx);\n\t\t\tif (valid) zone.classList.add('card-zone--highlight');\n\t\t}\n\t}\n}\n\nfunction handleDragEnd(e) {\n\tif (!dragState) return;\n\n\tdocument.removeEventListener('mousemove', handleDragMove);\n\tdocument.removeEventListener('touchmove', handleDragMove);\n\tdocument.removeEventListener('mouseup', handleDragEnd);\n\tdocument.removeEventListener('touchend', handleDragEnd);\n\tdocument.querySelectorAll('.card-zone--highlight').forEach(el => el.classList.remove('card-zone--highlight'));\n\n\tconst touch = e.changedTouches ? e.changedTouches[0] : e;\n\n\tif (!dragState.moved) {\n\t\t// It was a click — try auto-foundation on double-click behavior\n\t\tresetDragVisuals();\n\t\tconst cardId = dragState.cards[0].id;\n\t\ttryAutoFoundation(cardId);\n\t\tdragState = null;\n\t\treturn;\n\t}\n\n\t// Find drop target\n\t// Temporarily hide dragged elements to find what's underneath\n\tdragState.elements.forEach(el => el.style.display = 'none');\n\tconst elemBelow = document.elementFromPoint(touch.clientX, touch.clientY);\n\tdragState.elements.forEach(el => el.style.display = '');\n\n\tlet dropped = false;\n\tif (elemBelow) {\n\t\tconst zone = elemBelow.closest('[data-zone]');\n\t\tif (zone) {\n\t\t\tconst zType = zone.dataset.zone;\n\t\t\tconst zIdx = parseInt(zone.dataset.index);\n\t\t\tif (zType === 'tableau' || zType === 'foundation') {\n\t\t\t\tdropped = moveCards(dragState.loc, zType, zIdx);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!dropped) {\n\t\tresetDragVisuals();\n\t\trender();\n\t}\n\n\tdragState = null;\n}\n\nfunction resetDragVisuals() {\n\tif (!dragState) return;\n\tdragState.elements.forEach((el, i) => {\n\t\tel.classList.remove('card--dragging', 'card--dragging-child');\n\t\tel.style.position = '';\n\t\tel.style.left = '';\n\t\tel.style.top = '';\n\t\tel.style.setProperty('--z', dragState.originalPositions[i].z);\n\t\tel.style.setProperty('--top', dragState.originalPositions[i].top);\n\t});\n}\n\n// Stock click\ndocument.getElementById('stock').addEventListener('click', (e) => {\n\tif (!e.target.closest('.card--face-up')) {\n\t\tdrawFromStock();\n\t}\n});\n\n// Double-click for auto-foundation\nboard.addEventListener('dblclick', (e) => {\n\tconst cardEl = getCardElement(e.target);\n\tif (!cardEl) return;\n\ttryAutoFoundation(cardEl.dataset.cardId);\n});\n\n// Autoplay button\ndocument.getElementById('autoPlayBtn').addEventListener('click', () => {\n\tif (autoPlayInterval) stopAutoPlay();\n\telse startAutoPlay();\n});\n\n// New game buttons\ndocument.getElementById('newGameBtn').addEventListener('click', () => {\n\tstopAutoPlay();\n\tdeal();\n});\ndocument.getElementById('winNewGame').addEventListener('click', () => {\n\tstopAutoPlay();\n\tdeal();\n});\n\n// ─── Autoplay ────────────────────────────────────────────────────────────────\nlet autoPlayInterval = null;\n\nfunction boardStateKey() {\n\tconst t = state.tableau.map(p => p.map(c => (c.faceUp ? c.id : '?')).join(',')).join('|');\n\tconst f = state.foundations.map(p => p.length ? p[p.length - 1].id : '').join('|');\n\tconst w = state.waste.length ? state.waste[state.waste.length - 1].id : '';\n\tconst s = state.stock.length;\n\treturn `${t}/${f}/${w}/${s}`;\n}\n\nfunction findBestMove() {\n\t// 1. Move to foundation (always safe, always progress)\n\tconst wasteTop = state.waste.length ? [{\n\t\tzone: 'waste',\n\t\tindex: 0,\n\t\tcardIndex: state.waste.length - 1\n\t}] : [];\n\tconst tableauTops = state.tableau.map((pile, col) =>\n\t\tpile.length ? {\n\t\t\tzone: 'tableau',\n\t\t\tindex: col,\n\t\t\tcardIndex: pile.length - 1\n\t\t} : null\n\t).filter(Boolean);\n\n\tfor (const loc of [...wasteTop, ...tableauTops]) {\n\t\tconst cards = getCards(loc);\n\t\tif (cards.length !== 1) continue;\n\t\tfor (let fi = 0; fi < 4; fi++) {\n\t\t\tif (canPlaceOnFoundation(cards[0], fi)) return {\n\t\t\t\tfrom: loc,\n\t\t\t\ttoZone: 'foundation',\n\t\t\t\ttoIndex: fi\n\t\t\t};\n\t\t}\n\t}\n\n\t// 2. Tableau moves that uncover a face-down card (genuine progress)\n\tfor (let col = 0; col < 7; col++) {\n\t\tconst pile = state.tableau[col];\n\t\tif (!pile.length) continue;\n\t\tconst firstFaceUp = pile.findIndex(c => c.faceUp);\n\t\tif (firstFaceUp <= 0) continue; // no face-down cards beneath\n\t\tconst cards = pile.slice(firstFaceUp);\n\t\tfor (let dest = 0; dest < 7; dest++) {\n\t\t\tif (dest === col) continue;\n\t\t\tif (state.tableau[dest].length === 0) continue; // don't move to empty unless king\n\t\t\tif (canPlaceOnTableau(cards, dest)) {\n\t\t\t\treturn {\n\t\t\t\t\tfrom: {\n\t\t\t\t\t\tzone: 'tableau',\n\t\t\t\t\t\tindex: col,\n\t\t\t\t\t\tcardIndex: firstFaceUp\n\t\t\t\t\t},\n\t\t\t\t\ttoZone: 'tableau',\n\t\t\t\t\ttoIndex: dest\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\t// 3. Move king to empty column only if it uncovers a face-down card\n\tfor (let col = 0; col < 7; col++) {\n\t\tconst pile = state.tableau[col];\n\t\tif (!pile.length) continue;\n\t\tconst firstFaceUp = pile.findIndex(c => c.faceUp);\n\t\tif (firstFaceUp <= 0) continue;\n\t\tconst cards = pile.slice(firstFaceUp);\n\t\tif (cards[0].value !== 12) continue; // must be a king\n\t\tfor (let dest = 0; dest < 7; dest++) {\n\t\t\tif (dest === col) continue;\n\t\t\tif (state.tableau[dest].length !== 0) continue;\n\t\t\treturn {\n\t\t\t\tfrom: {\n\t\t\t\t\tzone: 'tableau',\n\t\t\t\t\tindex: col,\n\t\t\t\t\tcardIndex: firstFaceUp\n\t\t\t\t},\n\t\t\t\ttoZone: 'tableau',\n\t\t\t\ttoIndex: dest\n\t\t\t};\n\t\t}\n\t}\n\n\t// 4. Move from waste to tableau (only if it lands on a face-up card, not empty)\n\tif (state.waste.length) {\n\t\tconst loc = {\n\t\t\tzone: 'waste',\n\t\t\tindex: 0,\n\t\t\tcardIndex: state.waste.length - 1\n\t\t};\n\t\tconst cards = getCards(loc);\n\t\tfor (let dest = 0; dest < 7; dest++) {\n\t\t\tif (state.tableau[dest].length === 0) continue;\n\t\t\tif (canPlaceOnTableau(cards, dest)) return {\n\t\t\t\tfrom: loc,\n\t\t\t\ttoZone: 'tableau',\n\t\t\t\ttoIndex: dest\n\t\t\t};\n\t\t}\n\t}\n\n\t// 5. Draw from stock\n\tif (state.stock.length > 0 || state.waste.length > 0) {\n\t\treturn {\n\t\t\taction: 'draw'\n\t\t};\n\t}\n\n\treturn null;\n}\n\nfunction autoStep() {\n\tconst keyBefore = boardStateKey();\n\tconst move = findBestMove();\n\tif (!move) {\n\t\tstopAutoPlay();\n\t\treturn;\n\t}\n\n\tif (move.action === 'draw') {\n\t\tdrawFromStock();\n\t} else {\n\t\tmoveCards(move.from, move.toZone, move.toIndex);\n\t}\n\n\tconst keyAfter = boardStateKey();\n\tif (keyAfter === keyBefore) {\n\t\t// Nothing actually changed — we're stuck\n\t\tstopAutoPlay();\n\t\treturn;\n\t}\n\t// If we've seen this state before, we're looping — stop\n\tif (autoVisited.has(keyAfter)) {\n\t\tstopAutoPlay();\n\t\treturn;\n\t}\n\tautoVisited.add(keyAfter);\n}\n\nfunction startAutoPlay() {\n\tif (autoPlayInterval) return;\n\tconst btn = document.getElementById('autoPlayBtn');\n\tbtn.classList.add('is-playing');\n\tbtn.querySelector('i,svg').setAttribute('data-lucide', 'zap-off');\n\tlucide.createIcons();\n\tautoPlayInterval = setInterval(autoStep, 320);\n}\n\nfunction stopAutoPlay() {\n\tclearInterval(autoPlayInterval);\n\tautoPlayInterval = null;\n\tconst btn = document.getElementById('autoPlayBtn');\n\tbtn.classList.remove('is-playing');\n\tbtn.querySelector('i,svg').setAttribute('data-lucide', 'zap');\n\tlucide.createIcons();\n}\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─── Sound Engine ───────────────────────────────────────────────────────────\nconst Audio = window.AudioContext || window.webkitAudioContext;\nlet audioCtx = null;\n\nfunction getAudioCtx() {\n\tif (!audioCtx) audioCtx = new Audio();\n\treturn audioCtx;\n}\n\nfunction playTone({\n\ttype = 'sine',\n\tfreq = 440,\n\tfreq2 = null,\n\tgain = 0.18,\n\tattack = 0.005,\n\tdecay = 0.08,\n\tduration = 0.12\n} = {}) {\n\ttry {\n\t\tconst ctx = getAudioCtx();\n\t\tconst osc = ctx.createOscillator();\n\t\tconst gainNode = ctx.createGain();\n\t\tosc.connect(gainNode);\n\t\tgainNode.connect(ctx.destination);\n\t\tosc.type = type;\n\t\tosc.frequency.setValueAtTime(freq, ctx.currentTime);\n\t\tif (freq2) osc.frequency.linearRampToValueAtTime(freq2, ctx.currentTime + duration);\n\t\tgainNode.gain.setValueAtTime(0, ctx.currentTime);\n\t\tgainNode.gain.linearRampToValueAtTime(gain, ctx.currentTime + attack);\n\t\tgainNode.gain.exponentialRampToValueAtTime(0.0001, ctx.currentTime + attack + decay);\n\t\tosc.start(ctx.currentTime);\n\t\tosc.stop(ctx.currentTime + attack + decay + 0.01);\n\t} catch (e) {}\n}\n\nfunction playNoise({\n\tgain = 0.07,\n\tduration = 0.04\n} = {}) {\n\ttry {\n\t\tconst ctx = getAudioCtx();\n\t\tconst bufSize = ctx.sampleRate * duration;\n\t\tconst buf = ctx.createBuffer(1, bufSize, ctx.sampleRate);\n\t\tconst data = buf.getChannelData(0);\n\t\tfor (let i = 0; i < bufSize; i++) data[i] = (Math.random() * 2 - 1);\n\t\tconst src = ctx.createBufferSource();\n\t\tsrc.buffer = buf;\n\t\tconst gainNode = ctx.createGain();\n\t\tconst filter = ctx.createBiquadFilter();\n\t\tfilter.type = 'bandpass';\n\t\tfilter.frequency.value = 1800;\n\t\tfilter.Q.value = 0.8;\n\t\tsrc.connect(filter);\n\t\tfilter.connect(gainNode);\n\t\tgainNode.connect(ctx.destination);\n\t\tgainNode.gain.setValueAtTime(gain, ctx.currentTime);\n\t\tgainNode.gain.exponentialRampToValueAtTime(0.0001, ctx.currentTime + duration);\n\t\tsrc.start(ctx.currentTime);\n\t\tsrc.stop(ctx.currentTime + duration + 0.01);\n\t} catch (e) {}\n}\n\nconst SFX = {\n\tdraw() {\n\t\tplayNoise({\n\t\t\tgain: 0.10,\n\t\t\tduration: 0.035\n\t\t});\n\t\tplayTone({\n\t\t\ttype: 'triangle',\n\t\t\tfreq: 520,\n\t\t\tfreq2: 440,\n\t\t\tgain: 0.07,\n\t\t\tdecay: 0.07\n\t\t});\n\t},\n\tflip() {\n\t\tplayNoise({\n\t\t\tgain: 0.07,\n\t\t\tduration: 0.03\n\t\t});\n\t\tplayTone({\n\t\t\ttype: 'triangle',\n\t\t\tfreq: 480,\n\t\t\tfreq2: 560,\n\t\t\tgain: 0.06,\n\t\t\tdecay: 0.06\n\t\t});\n\t},\n\tdrop() {\n\t\tplayNoise({\n\t\t\tgain: 0.13,\n\t\t\tduration: 0.04\n\t\t});\n\t\tplayTone({\n\t\t\ttype: 'sine',\n\t\t\tfreq: 300,\n\t\t\tfreq2: 260,\n\t\t\tgain: 0.12,\n\t\t\tdecay: 0.10\n\t\t});\n\t},\n\tfoundation() {\n\t\tplayTone({\n\t\t\ttype: 'sine',\n\t\t\tfreq: 660,\n\t\t\tgain: 0.15,\n\t\t\tdecay: 0.12\n\t\t});\n\t\tplayTone({\n\t\t\ttype: 'sine',\n\t\t\tfreq: 880,\n\t\t\tgain: 0.10,\n\t\t\tdecay: 0.10\n\t\t});\n\t\tplayNoise({\n\t\t\tgain: 0.06,\n\t\t\tduration: 0.03\n\t\t});\n\t},\n\trecycle() {\n\t\tplayTone({\n\t\t\ttype: 'sine',\n\t\t\tfreq: 320,\n\t\t\tfreq2: 200,\n\t\t\tgain: 0.12,\n\t\t\tdecay: 0.18\n\t\t});\n\t\tplayNoise({\n\t\t\tgain: 0.08,\n\t\t\tduration: 0.06\n\t\t});\n\t},\n\twin() {\n\t\tconst ctx = getAudioCtx();\n\t\tconst notes = [523, 659, 784, 1047];\n\t\tnotes.forEach((freq, i) => {\n\t\t\tconst osc = ctx.createOscillator();\n\t\t\tconst g = ctx.createGain();\n\t\t\tosc.connect(g);\n\t\t\tg.connect(ctx.destination);\n\t\t\tosc.type = 'sine';\n\t\t\tosc.frequency.setValueAtTime(freq, ctx.currentTime);\n\t\t\tconst t = ctx.currentTime + i * 0.13;\n\t\t\tg.gain.setValueAtTime(0, t);\n\t\t\tg.gain.linearRampToValueAtTime(0.18, t + 0.01);\n\t\t\tg.gain.exponentialRampToValueAtTime(0.0001, t + 0.35);\n\t\t\tosc.start(t);\n\t\t\tosc.stop(t + 0.36);\n\t\t});\n\t}\n};\n// ────────────────────────────────────────────────────────────────────────────\n\n// Initialize\nlucide.createIcons();\ndeal();"},{"name":"style.css","content":":root {\n\tcolor-scheme: dark;\n\tfont-family: 'Segoe UI', system-ui, sans-serif;\n\t--felt: #1a5c38;\n\t--felt-dark: #0f3d24;\n\t--felt-light: #237a4b;\n\t--gold: #c9a84c;\n\t--gold-dim: #8a7235;\n\t--card-white: #f5f0e8;\n\t--card-shadow: rgba(0, 0, 0, 0.4);\n\t--red-suit: #c0392b;\n\t--black-suit: #1a1a2e;\n\t--card-w: min(11vw, 100px);\n\t--card-h: calc(var(--card-w) * 1.45);\n\t--card-radius: clamp(4px, 0.6vw, 8px);\n\t--stack-offset: calc(var(--card-h) * 0.18);\n\t--stack-offset-hidden: calc(var(--card-h) * 0.07);\n}\n\n* {\n\tbox-sizing: border-box;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nbody {\n\tbackground: var(--felt-dark);\n\toverflow: hidden;\n\theight: 100dvh;\n\tuser-select: none;\n\t-webkit-user-select: none;\n}\n\n.solitaire {\n\theight: 100dvh;\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground:\n\t\tradial-gradient(ellipse at 50% 30%, var(--felt-light) 0%, var(--felt) 50%, var(--felt-dark) 100%);\n}\n\n/* Header */\n.solitaire__header {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 10px clamp(12px, 3vw, 24px);\n\tbackground: rgba(0, 0, 0, 0.3);\n\tbackdrop-filter: blur(8px);\n\tborder-bottom: 1px solid rgba(201, 168, 76, 0.2);\n\tflex-shrink: 0;\n}\n\n.solitaire__brand {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.solitaire__icon {\n\twidth: 22px;\n\theight: 22px;\n\tcolor: var(--gold);\n}\n\n.solitaire__title {\n\tfont-size: clamp(16px, 2.5vw, 22px);\n\tfont-weight: 700;\n\tcolor: var(--gold);\n\tletter-spacing: 0.05em;\n\ttext-transform: uppercase;\n}\n\n.solitaire__stats {\n\tdisplay: flex;\n\tgap: clamp(12px, 3vw, 32px);\n}\n\n.solitaire__stat {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tgap: 1px;\n}\n\n.solitaire__stat-label {\n\tfont-size: 10px;\n\ttext-transform: uppercase;\n\tletter-spacing: 0.08em;\n\tcolor: rgba(255, 255, 255, 0.4);\n}\n\n.solitaire__stat-value {\n\tfont-size: clamp(14px, 2vw, 18px);\n\tfont-weight: 700;\n\tcolor: #fff;\n\tfont-variant-numeric: tabular-nums;\n}\n\n.solitaire__new-game {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 8px 16px;\n\tbackground: rgba(201, 168, 76, 0.15);\n\tborder: 1px solid var(--gold-dim);\n\tborder-radius: 6px;\n\tcolor: var(--gold);\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcursor: pointer;\n\ttransition: all 0.2s;\n\twhite-space: nowrap;\n}\n\n.solitaire__auto-btn {\n\tborder-color: #4a9eff55;\n\tcolor: #4a9eff;\n\tbackground: rgba(74, 158, 255, 0.10);\n}\n\n.solitaire__auto-btn:hover {\n\tbackground: rgba(74, 158, 255, 0.22) !important;\n\tborder-color: #4a9eff !important;\n\tcolor: #4a9eff !important;\n}\n\n.solitaire__auto-btn.is-playing {\n\tbackground: rgba(74, 158, 255, 0.22);\n\tborder-color: #4a9eff;\n\tcolor: #4a9eff;\n\tanimation: autoPulse 1s ease-in-out infinite;\n}\n\n@keyframes autoPulse {\n\t0%, 100% {\n\t\tbox-shadow: 0 0 0 0 rgba(74, 158, 255, 0.35);\n\t}\n\n\t50% {\n\t\tbox-shadow: 0 0 0 6px rgba(74, 158, 255, 0);\n\t}\n}\n\n.solitaire__new-game:hover {\n\tbackground: rgba(201, 168, 76, 0.25);\n\tborder-color: var(--gold);\n}\n\n.solitaire__new-game svg {\n\twidth: 14px;\n\theight: 14px;\n}\n\n/* Board */\n.solitaire__board {\n\tflex: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding: clamp(8px, 2vw, 20px) clamp(8px, 2vw, 24px);\n\tgap: clamp(10px, 2vw, 20px);\n\toverflow: hidden;\n}\n\n.solitaire__top-row {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\tflex-shrink: 0;\n}\n\n.solitaire__stock-waste {\n\tdisplay: flex;\n\tgap: clamp(6px, 1.5vw, 14px);\n}\n\n.solitaire__foundations {\n\tdisplay: flex;\n\tgap: clamp(6px, 1.5vw, 14px);\n}\n\n/* Card zones */\n.card-zone {\n\twidth: var(--card-w);\n\tmin-height: var(--card-h);\n\tposition: relative;\n\tborder-radius: var(--card-radius);\n}\n\n.card-zone--stock,\n.card-zone--waste,\n.card-zone--foundation {\n\theight: var(--card-h);\n\tbackground: rgba(0, 0, 0, 0.15);\n\tborder: 2px dashed rgba(255, 255, 255, 0.1);\n}\n\n.card-zone--stock {\n\tcursor: pointer;\n}\n\n.card-zone__label {\n\tposition: absolute;\n\tinset: 0;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tfont-size: 11px;\n\ttext-transform: uppercase;\n\tletter-spacing: 0.1em;\n\tcolor: rgba(255, 255, 255, 0.12);\n\tpointer-events: none;\n}\n\n.card-zone__suit {\n\tposition: absolute;\n\tinset: 0;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tfont-size: clamp(20px, 3vw, 32px);\n\tcolor: rgba(255, 255, 255, 0.08);\n\tpointer-events: none;\n}\n\n.card-zone--tableau {\n\tflex: 1;\n\tmin-height: calc(var(--card-h) + var(--stack-offset) * 6);\n}\n\n.solitaire__tableau {\n\tdisplay: flex;\n\tgap: clamp(4px, 1vw, 12px);\n\tflex: 1;\n\tjustify-content: center;\n}\n\n/* Cards */\n.card {\n\tposition: absolute;\n\twidth: var(--card-w);\n\theight: var(--card-h);\n\tborder-radius: var(--card-radius);\n\tcursor: pointer;\n\ttransition: box-shadow 0.15s;\n\ttransform-origin: center center;\n\tz-index: var(--z, 1);\n\ttop: var(--top, 0);\n\tleft: 0;\n}\n\n.card--face-up {\n\tbackground: var(--card-white);\n\tborder: 1px solid rgba(0, 0, 0, 0.12);\n\tbox-shadow: 0 1px 3px var(--card-shadow);\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding: clamp(2px, 0.4vw, 5px);\n}\n\n.card--face-up:hover {\n\tbox-shadow: 0 3px 10px var(--card-shadow);\n}\n\n.card--face-down {\n\tbackground:\n\t\trepeating-linear-gradient(45deg,\n\t\t\t#1a3a6e,\n\t\t\t#1a3a6e 3px,\n\t\t\t#1e4080 3px,\n\t\t\t#1e4080 6px);\n\tborder: 2px solid #264d93;\n\tbox-shadow:\n\t\t0 1px 3px var(--card-shadow),\n\t\tinset 0 0 0 3px rgba(0, 0, 0, 0.15),\n\t\tinset 0 0 0 5px rgba(100, 140, 200, 0.15);\n}\n\n.card--red {\n\tcolor: var(--red-suit);\n}\n\n.card--black {\n\tcolor: var(--black-suit);\n}\n\n.card__corner {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tline-height: 1;\n\tgap: 0;\n}\n\n.card__corner--top {\n\talign-self: flex-start;\n}\n\n.card__corner--bottom {\n\talign-self: flex-end;\n\ttransform: rotate(180deg);\n\tmargin-top: auto;\n}\n\n.card__rank {\n\tfont-size: clamp(11px, 1.6vw, 16px);\n\tfont-weight: 800;\n}\n\n.card__suit {\n\tfont-size: clamp(10px, 1.4vw, 14px);\n\tline-height: 1;\n}\n\n.card__center-suit {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%);\n\tfont-size: clamp(22px, 3.5vw, 36px);\n\topacity: 0.3;\n}\n\n/* Dragging */\n.card--dragging {\n\tz-index: 10000 !important;\n\tbox-shadow: 0 12px 40px rgba(0, 0, 0, 0.5) !important;\n\tpointer-events: none;\n\ttransition: none;\n\ttransform: rotate(2deg);\n}\n\n.card--dragging-child {\n\tz-index: 10000 !important;\n\tpointer-events: none;\n\ttransition: none;\n}\n\n/* Drop target highlight */\n.card-zone--highlight {\n\tbox-shadow: 0 0 0 3px var(--gold), 0 0 20px rgba(201, 168, 76, 0.3);\n}\n\n/* Card dealing animation */\n.card--dealing {\n\topacity: 0;\n\tanimation: dealCard 0.4s cubic-bezier(0.22, 0.68, 0.35, 1.2) forwards;\n\tanimation-delay: var(--deal-delay, 0s);\n}\n\n@keyframes dealCard {\n\t0% {\n\t\topacity: 0;\n\t\ttransform: translateY(-40px) translateX(-20px) scale(0.8) rotate(-4deg);\n\t}\n\n\t50% {\n\t\topacity: 1;\n\t}\n\n\t75% {\n\t\ttransform: translateY(3px) translateX(0) scale(1.015) rotate(0.5deg);\n\t}\n\n\t100% {\n\t\topacity: 1;\n\t\ttransform: translateY(0) translateX(0) scale(1) rotate(0deg);\n\t}\n}\n\n.card--deal-stock {\n\topacity: 0;\n\tanimation: dealStock 0.2s ease-out forwards;\n\tanimation-delay: var(--deal-delay, 0s);\n}\n\n@keyframes dealStock {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: scale(0.9);\n\t}\n\n\tto {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t}\n}\n\n/* Stock recycle indicator */\n.card-zone--stock.card-zone--empty {\n\tcursor: pointer;\n}\n\n.card-zone--stock.card-zone--empty::after {\n\tcontent: '';\n\tposition: absolute;\n\tinset: 0;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tborder-radius: var(--card-radius);\n\tbackground: rgba(201, 168, 76, 0.08);\n}\n\n/* Win overlay */\n.solitaire__win-overlay {\n\tposition: fixed;\n\tinset: 0;\n\tbackground: rgba(0, 0, 0, 0.7);\n\tbackdrop-filter: blur(6px);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tz-index: 20000;\n\topacity: 0;\n\tpointer-events: none;\n\ttransition: opacity 0.4s;\n}\n\n.solitaire__win-overlay--visible {\n\topacity: 1;\n\tpointer-events: all;\n}\n\n.solitaire__win-card {\n\tbackground: linear-gradient(145deg, #1a3322, #0f2618);\n\tborder: 2px solid var(--gold);\n\tborder-radius: 16px;\n\tpadding: 40px 48px;\n\ttext-align: center;\n\tbox-shadow: 0 0 60px rgba(201, 168, 76, 0.2);\n}\n\n.solitaire__win-title {\n\tfont-size: 36px;\n\tcolor: var(--gold);\n\tmargin-bottom: 20px;\n\tletter-spacing: 0.05em;\n}\n\n.solitaire__win-stats {\n\tdisplay: flex;\n\tgap: 32px;\n\tjustify-content: center;\n\tmargin-bottom: 28px;\n\tcolor: rgba(255, 255, 255, 0.6);\n\tfont-size: 15px;\n}\n\n.solitaire__win-stats strong {\n\tcolor: #fff;\n}\n\n/* Double-click hint */\n.card--hint {\n\tanimation: hintPulse 0.4s ease;\n}\n\n@keyframes hintPulse {\n\t0%, 100% {\n\t\ttransform: scale(1);\n\t}\n\n\t50% {\n\t\ttransform: scale(1.03);\n\t\tbox-shadow: 0 0 15px rgba(201, 168, 76, 0.4);\n\t}\n}\n\n@media (max-width: 600px) {\n\t:root {\n\t\t--card-w: 13vw;\n\t}\n\n\t.solitaire__header {\n\t\tpadding: 8px 10px;\n\t}\n\n\t.solitaire__stats {\n\t\tgap: 10px;\n\t}\n\n\t.solitaire__new-game span {\n\t\tdisplay: none;\n\t}\n}"}],"folders":[]},"variants":null,"createdAt":"2026-03-02T01:48:54.416Z","updatedAt":"2026-03-04T20:52:08.006Z"}}