-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.d5f8f964.js.map
1 lines (1 loc) · 33.6 KB
/
index.d5f8f964.js.map
1
{"mappings":"A,I,E,W,E,C,E,E,C,E,E,E,iB,A,O,I,A,C,E,S,C,E,G,K,E,O,C,C,E,C,O,C,G,K,E,C,I,E,C,C,E,A,Q,C,C,E,C,I,E,C,G,E,Q,C,C,E,O,C,C,E,C,E,E,I,C,E,O,C,E,E,O,E,E,O,A,C,I,E,A,M,uB,E,I,O,E,I,C,mB,C,C,E,Q,C,S,C,C,C,E,C,C,E,C,C,E,E,iB,C,G,A,C,E,E,Q,A,E,Q,S,C,C,C,E,O,c,C,E,O,C,W,C,I,I,E,I,A,G,E,E,W,C,E,a,C,C,GCEA,IAgBA,EAhBI,EAAU,IAAI,IAgBlB,EAfA,SAAkB,CAAO,CAAE,CAAQ,EACjC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,MAAM,CAAG,EAAG,GAAK,EAC5C,EAAQ,GAAG,CAAC,CAAQ,CAAC,EAAE,CAAE,CACvB,QAAS,EACT,KAAM,CAAQ,CAAC,EAAI,EAAE,AACvB,EAEJ,C,GCVA,AAAA,EAAA,SAAA,QAAA,CAA8C,IAAA,IAAoB,GAAA,YAAA,GAAA,EAAI,QAAQ,GAAG,KAAK,KAAK,CAAC,6T,I,E,C,EEA5F,EAAiB,IAAA,IAAoB,+CAAA,YAAA,GAAA,EAAgD,QAAQ,G,I,E,C,ECA7F,EAAiB,IAAA,IAAoB,+CAAA,YAAA,GAAA,EAAgD,QAAQ,G,I,E,C,ECA7F,EAAiB,IAAA,IAAoB,+CAAA,YAAA,GAAA,EAAgD,QAAQ,G,I,E,C,ECA7F,EAAiB,IAAA,IAAoB,0CAAA,YAAA,GAAA,EAA2C,QAAQ,G,I,E,C,ECAxF,EAAiB,IAAA,IAAoB,2CAAA,YAAA,GAAA,EAA4C,QAAQ,GLAxF,AAAA,WAEC,IAAI,EAAY,EACZ,EAAY,EACZ,EAAQ,EACR,EAAQ,EACR,EAAW,EACX,EAAY,CAAA,EACZ,EAAY,CAAA,EACZ,EAAa,CAAA,EACX,EAAe,SAAS,aAAa,CAAC,mBACtC,EAAY,SAAS,gBAAgB,CAAC,iBACtC,EAAU,SAAS,aAAa,CAAC,aACjC,EAAc,SAAS,aAAa,CAAC,kBACrC,EAAgB,SAAS,aAAa,CAAC,oBACvC,EAAU,SAAS,aAAa,CAAC,cACjC,EAAU,SAAS,aAAa,CAAC,cACjC,EAAa,SAAS,aAAa,C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","sources":["<anon>","node_modules/@parcel/runtime-js/lib/helpers/bundle-manifest.js","node_modules/@parcel/runtime-js/lib/runtime-b852c0ddd31c673c.js","src/app.js","node_modules/@parcel/runtime-js/lib/runtime-b233bee012931da2.js","node_modules/@parcel/runtime-js/lib/runtime-8bad5cb3246ccfcf.js","node_modules/@parcel/runtime-js/lib/runtime-123679406ee391d7.js","node_modules/@parcel/runtime-js/lib/runtime-88b758d19751794a.js","node_modules/@parcel/runtime-js/lib/runtime-80e792aa0e214982.js"],"sourcesContent":["\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\n var $parcel$global = globalThis;\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequire94c2\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequire94c2\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nparcelRegister(\"27Lyk\", function(module, exports) {\n\n$parcel$export(module.exports, \"register\", () => $18c11f3350a906ea$export$6503ec6e8aabbaf, (v) => $18c11f3350a906ea$export$6503ec6e8aabbaf = v);\nvar $18c11f3350a906ea$export$6503ec6e8aabbaf;\nvar $18c11f3350a906ea$export$f7ad0328861e2f03;\n\"use strict\";\nvar $18c11f3350a906ea$var$mapping = new Map();\nfunction $18c11f3350a906ea$var$register(baseUrl, manifest) {\n for(var i = 0; i < manifest.length - 1; i += 2)$18c11f3350a906ea$var$mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n}\nfunction $18c11f3350a906ea$var$resolve(id) {\n var resolved = $18c11f3350a906ea$var$mapping.get(id);\n if (resolved == null) throw new Error('Could not resolve bundle with id ' + id);\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\n$18c11f3350a906ea$export$6503ec6e8aabbaf = $18c11f3350a906ea$var$register;\n$18c11f3350a906ea$export$f7ad0328861e2f03 = $18c11f3350a906ea$var$resolve;\n\n});\n\nvar $0324d18deac3e037$exports = {};\n\n(parcelRequire(\"27Lyk\")).register(new URL(\"\", import.meta.url).toString(), JSON.parse(\"[\\\"izUj7\\\",\\\"index.d5f8f964.js\\\",\\\"5uh3D\\\",\\\"player-x-click.af6e08c2.mp3\\\",\\\"4axc6\\\",\\\"player-o-click.908137e5.mp3\\\",\\\"2nDpq\\\",\\\"applause-cheer.a973b097.mp3\\\",\\\"7Xf6p\\\",\\\"dark-mode.d3a35ea1.png\\\",\\\"fA2oz\\\",\\\"light-mode.0d2c3b71.png\\\"]\"));\n\nvar $ef0b7eda38450762$exports = {};\n$ef0b7eda38450762$exports = new URL(\"player-x-click.af6e08c2.mp3\", import.meta.url).toString();\n\n\nvar $979e45545fb41b0c$exports = {};\n$979e45545fb41b0c$exports = new URL(\"player-o-click.908137e5.mp3\", import.meta.url).toString();\n\n\nvar $9839198d020e05d2$exports = {};\n$9839198d020e05d2$exports = new URL(\"applause-cheer.a973b097.mp3\", import.meta.url).toString();\n\n\nvar $abb1f5ecb202b013$exports = {};\n$abb1f5ecb202b013$exports = new URL(\"dark-mode.d3a35ea1.png\", import.meta.url).toString();\n\n\nvar $02ed74011ffb8561$exports = {};\n$02ed74011ffb8561$exports = new URL(\"light-mode.0d2c3b71.png\", import.meta.url).toString();\n\n\n(function() {\n /** Set Global variables and cache DOM element refs **/ let gameCount = 0;\n let gameMoves = 0;\n let xWins = 0;\n let oWins = 0;\n let gameTies = 0;\n let isXActive = true;\n let isOActive = false;\n let isDarkMode = true;\n const appWrapperEl = document.querySelector(\".js-app-wrapper\");\n const tileElems = document.querySelectorAll(\".js-game-tile\");\n const popupEl = document.querySelector(\".js-popup\");\n const popupTextEl = document.querySelector(\".js-popup-text\");\n const restartGameEl = document.querySelector(\".js-restart-game\");\n const xWinsEl = document.querySelector(\".js-x-wins\");\n const oWinsEl = document.querySelector(\".js-o-wins\");\n const gameTiesEl = document.querySelector(\".js-game-ties\");\n const alertEl = document.querySelector(\".js-alert\");\n const alertTextEl = document.querySelector(\".js-alert-text\");\n const alertCloseEl = document.querySelector(\".js-alert-close\");\n const modeChangeEl = document.querySelector(\".js-mode-change\");\n const modeImageEl = document.querySelector(\".js-mode-image\");\n const totalMoves = 9;\n const xHoverClassName = \"game-tile-x-hover\";\n const oHoverClassName = \"game-tile-o-hover\";\n const xActiveClassName = \"game-tile-x-active\";\n const oActiveClassName = \"game-tile-o-active\";\n const tieColorClassName = \"color-tie\";\n const xColorClassName = \"color-x\";\n const oColorClassName = \"color-o\";\n const darkModeClassName = \"dark-mode\";\n const xText = \"X\";\n const oText = \"O\";\n const xSoundPath = new URL($ef0b7eda38450762$exports);\n const oSoundPath = new URL($979e45545fb41b0c$exports);\n const applauseSoundPath = new URL($9839198d020e05d2$exports);\n const darkModeImagePath = new URL($abb1f5ecb202b013$exports);\n const lightModeImagePath = new URL($02ed74011ffb8561$exports);\n const combinationMap = {\n \"1\": [\n \"1-2-3\",\n \"1-4-7\",\n \"1-5-9\"\n ],\n \"2\": [\n \"1-2-3\",\n \"2-5-8\"\n ],\n \"3\": [\n \"1-2-3\",\n \"3-5-7\",\n \"3-6-9\"\n ],\n \"4\": [\n \"1-4-7\",\n \"4-5-6\"\n ],\n \"5\": [\n \"1-5-9\",\n \"2-5-8\",\n \"3-5-7\",\n \"4-5-6\"\n ],\n \"6\": [\n \"3-6-9\",\n \"4-5-6\"\n ],\n \"7\": [\n \"1-4-7\",\n \"3-5-7\",\n \"7-8-9\"\n ],\n \"8\": [\n \"2-5-8\",\n \"7-8-9\"\n ],\n \"9\": [\n \"1-5-9\",\n \"3-6-9\",\n \"7-8-9\"\n ]\n };\n function initInteraction() {\n /** Reset game moves to zero **/ gameMoves = 0;\n /** Increment number of games **/ gameCount++;\n /** Hide Popup **/ popupEl.style.zIndex = -100;\n /** Reset popup text classes **/ popupTextEl.classList.remove(tieColorClassName);\n popupTextEl.classList.remove(xColorClassName);\n popupTextEl.classList.remove(oColorClassName);\n /** Set player active states **/ toggleActiveUsers(gameCount);\n initPlayerAlerts();\n /** Reset Tile UI states **/ tileElems.forEach((node)=>{\n /** Remove active class names **/ node.classList.remove(xActiveClassName);\n node.classList.remove(oActiveClassName);\n if (isXActive) {\n node.classList.add(xHoverClassName);\n node.addEventListener('click', handleTileClick, false);\n return;\n }\n node.classList.add(oHoverClassName);\n node.addEventListener('click', handleTileClick, false);\n });\n }\n function toggleActiveUsers(gameCount) {\n let isEvenGameCount = gameCount % 2 == 0;\n if (gameCount && isEvenGameCount) {\n isOActive = true;\n isXActive = false;\n return;\n } else if (gameCount && !isEvenGameCount) {\n isXActive = true;\n isOActive = false;\n return;\n }\n isXActive = !isXActive;\n isOActive = !isOActive;\n }\n function toggleHoverClassName(isXActive) {\n tileElems.forEach((node)=>{\n /** Ignore selected tiles **/ if (node.classList.contains(xActiveClassName) || node.classList.contains(oActiveClassName)) return;\n if (isXActive) {\n node.classList.remove(oHoverClassName);\n node.classList.add(xHoverClassName);\n return;\n }\n node.classList.remove(xHoverClassName);\n node.classList.add(oHoverClassName);\n });\n }\n function checkWinningCombinations(el) {\n const id = el.id.split(\"-\")[1];\n const itemMap = combinationMap[id];\n const activeClassName = isXActive ? xActiveClassName : isOActive ? oActiveClassName : \"\";\n const result = {\n className: activeClassName,\n combination: null,\n player: null,\n hasPlayerWon: false\n };\n itemMap.every((item)=>{\n const placementsArr = item.split(\"-\");\n const placementA = document.querySelector(`#tile-${placementsArr[0]}`);\n const placementB = document.querySelector(`#tile-${placementsArr[1]}`);\n const placementC = document.querySelector(`#tile-${placementsArr[2]}`);\n const hasCombinationWon = !!(placementA.classList.contains(activeClassName) && placementB.classList.contains(activeClassName) && placementC.classList.contains(activeClassName));\n if (hasCombinationWon) {\n result.combination = item;\n result.hasPlayerWon = true;\n result.player = isXActive ? \"X\" : isOActive ? \"O\" : null;\n return false;\n }\n return true;\n });\n console.log(\"result: \", result);\n return result;\n }\n function announceResult(obj, result) {\n let popupText, popupTextColor, resultEl, resultCounter;\n const isPlayerX = obj.player === xText;\n const isPlayerO = obj.player === oText;\n if (isPlayerX) {\n xWins++;\n resultCounter = xWins;\n resultEl = xWinsEl;\n } else if (isPlayerO) {\n oWins++;\n resultCounter = oWins;\n resultEl = oWinsEl;\n } else {\n gameTies++;\n resultCounter = gameTies;\n resultEl = gameTiesEl;\n }\n switch(result){\n case \"TIE\":\n popupText = `This round is tied!`;\n popupTextColor = tieColorClassName;\n break;\n case \"WIN\":\n popupText = `${obj.player} wins this round!`;\n popupTextColor = `color-${obj.player.toLowerCase()}`;\n playAudio(applauseSoundPath);\n initConfetti();\n break;\n }\n tileElems.forEach((node)=>{\n node.classList.remove(oHoverClassName);\n node.classList.remove(xHoverClassName);\n node.removeEventListener('click', handleTileClick, false);\n });\n popupTextEl.textContent = popupText;\n popupTextEl.classList.add(popupTextColor);\n resultEl.textContent = resultCounter;\n popupEl.style.zIndex = 100;\n hidePlayerAlert();\n }\n function handleTileClick(e) {\n const node = e.target;\n let combinationsResult = null;\n if (node.classList.contains(xActiveClassName) || node.classList.contains(oActiveClassName)) return;\n if (isXActive) {\n node.classList.add(xActiveClassName);\n node.classList.remove(xHoverClassName);\n node.textContent = xText;\n playAudio(xSoundPath);\n } else if (isOActive) {\n node.classList.add(oActiveClassName);\n node.classList.remove(oHoverClassName);\n node.textContent = oText;\n playAudio(oSoundPath);\n }\n gameMoves++;\n combinationsResult = checkWinningCombinations(node);\n /** Announce the game is Tied if gameMoves are 9 and no player has won. **/ if (gameMoves == totalMoves && !combinationsResult.hasPlayerWon) {\n announceResult(combinationsResult, \"TIE\");\n return;\n }\n if (combinationsResult.hasPlayerWon) {\n announceResult(combinationsResult, \"WIN\");\n return;\n }\n toggleActiveUsers();\n toggleHoverClassName(isXActive);\n initPlayerAlerts();\n return;\n }\n function setDOMEvents() {\n restartGameEl.addEventListener('click', ()=>initInteraction(), false);\n alertCloseEl.addEventListener('click', ()=>hidePlayerAlert(), false);\n modeChangeEl.addEventListener('click', ()=>toggleDisplayMode(), false);\n }\n function toggleDisplayMode() {\n if (isDarkMode) {\n appWrapperEl.classList.remove(darkModeClassName);\n modeImageEl.setAttribute(\"width\", \"40\");\n modeImageEl.setAttribute(\"height\", \"40\");\n modeImageEl.setAttribute(\"title\", \"Switch to Dark Mode\");\n modeImageEl.src = darkModeImagePath;\n isDarkMode = !isDarkMode;\n return;\n }\n appWrapperEl.classList.add(darkModeClassName);\n modeImageEl.setAttribute(\"width\", \"45\");\n modeImageEl.setAttribute(\"height\", \"45\");\n modeImageEl.setAttribute(\"title\", \"Switch to Light Mode\");\n modeImageEl.src = lightModeImagePath;\n isDarkMode = !isDarkMode;\n }\n function initConfetti() {\n const count = 200, defaults = {\n origin: {\n y: 0.7\n }\n };\n function fire(particleRatio, opts) {\n confetti(Object.assign({}, defaults, opts, {\n particleCount: Math.floor(count * particleRatio)\n }));\n }\n fire(0.25, {\n spread: 26,\n startVelocity: 55\n });\n fire(0.2, {\n spread: 60\n });\n fire(0.35, {\n spread: 100,\n decay: 0.91,\n scalar: 0.8\n });\n fire(0.1, {\n spread: 120,\n startVelocity: 25,\n decay: 0.92,\n scalar: 1.2\n });\n fire(0.1, {\n spread: 120,\n startVelocity: 45\n });\n }\n function initPlayerAlerts() {\n let computedText = '';\n if (isXActive) computedText = `${xText} turn to play!`;\n else computedText = `${oText} turn to play!`;\n alertTextEl.textContent = computedText;\n showPlayerAlert();\n }\n function showPlayerAlert() {\n alertEl.classList.add(\"show\");\n }\n function hidePlayerAlert() {\n alertEl.classList.remove(\"show\");\n }\n function playAudio(file) {\n const audio = new Audio(file);\n audio.play().catch((err)=>{\n console.log(\"Audio is not played \", err);\n });\n }\n initInteraction();\n setDOMEvents();\n})();\n\n\n//# sourceMappingURL=index.d5f8f964.js.map\n","\"use strict\";\n\nvar mapping = new Map();\nfunction register(baseUrl, manifest) {\n for (var i = 0; i < manifest.length - 1; i += 2) {\n mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n }\n}\nfunction resolve(id) {\n var resolved = mapping.get(id);\n if (resolved == null) {\n throw new Error('Could not resolve bundle with id ' + id);\n }\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\nmodule.exports.register = register;\nmodule.exports.resolve = resolve;","require('./helpers/bundle-manifest').register(new __parcel__URL__(\"\").toString(),JSON.parse(\"[\\\"izUj7\\\",\\\"index.d5f8f964.js\\\",\\\"5uh3D\\\",\\\"player-x-click.af6e08c2.mp3\\\",\\\"4axc6\\\",\\\"player-o-click.908137e5.mp3\\\",\\\"2nDpq\\\",\\\"applause-cheer.a973b097.mp3\\\",\\\"7Xf6p\\\",\\\"dark-mode.d3a35ea1.png\\\",\\\"fA2oz\\\",\\\"light-mode.0d2c3b71.png\\\"]\"));","(function() {\n /** Set Global variables and cache DOM element refs **/\n let gameCount = 0;\n let gameMoves = 0;\n let xWins = 0;\n let oWins = 0;\n let gameTies = 0;\n let isXActive = true;\n let isOActive = false;\n let isDarkMode = true;\n const appWrapperEl = document.querySelector(\".js-app-wrapper\");\n const tileElems = document.querySelectorAll(\".js-game-tile\");\n const popupEl = document.querySelector(\".js-popup\");\n const popupTextEl = document.querySelector(\".js-popup-text\");\n const restartGameEl = document.querySelector(\".js-restart-game\");\n const xWinsEl = document.querySelector(\".js-x-wins\");\n const oWinsEl = document.querySelector(\".js-o-wins\");\n const gameTiesEl = document.querySelector(\".js-game-ties\");\n const alertEl = document.querySelector(\".js-alert\");\n const alertTextEl = document.querySelector(\".js-alert-text\");\n const alertCloseEl = document.querySelector(\".js-alert-close\");\n const modeChangeEl = document.querySelector(\".js-mode-change\");\n const modeImageEl = document.querySelector(\".js-mode-image\");\n const totalMoves = 9;\n const xHoverClassName = \"game-tile-x-hover\";\n const oHoverClassName = \"game-tile-o-hover\";\n const xActiveClassName = \"game-tile-x-active\";\n const oActiveClassName = \"game-tile-o-active\";\n const tieColorClassName = \"color-tie\";\n const xColorClassName = \"color-x\";\n const oColorClassName = \"color-o\";\n const darkModeClassName = \"dark-mode\";\n const xText = \"X\";\n const oText = \"O\";\n const xSoundPath = new URL('assets/player-x-click.mp3', import.meta.url);\n const oSoundPath = new URL('assets/player-o-click.mp3', import.meta.url);\n const applauseSoundPath = new URL('assets/applause-cheer.mp3', import.meta.url);\n const darkModeImagePath = new URL('assets/dark-mode.png', import.meta.url);\n const lightModeImagePath = new URL('assets/light-mode.png', import.meta.url);\n const combinationMap = {\n \"1\": [\"1-2-3\", \"1-4-7\", \"1-5-9\"],\n \"2\": [\"1-2-3\", \"2-5-8\"],\n \"3\": [\"1-2-3\", \"3-5-7\", \"3-6-9\"],\n \"4\": [\"1-4-7\", \"4-5-6\"],\n \"5\": [\"1-5-9\", \"2-5-8\", \"3-5-7\", \"4-5-6\"],\n \"6\": [\"3-6-9\", \"4-5-6\"],\n \"7\": [\"1-4-7\", \"3-5-7\", \"7-8-9\"],\n \"8\": [\"2-5-8\", \"7-8-9\"],\n \"9\": [\"1-5-9\", \"3-6-9\", \"7-8-9\"]\n };\n\n function initInteraction() {\n /** Reset game moves to zero **/\n gameMoves = 0;\n\n /** Increment number of games **/\n gameCount++;\n\n /** Hide Popup **/\n popupEl.style.zIndex = -100;\n\n /** Reset popup text classes **/\n popupTextEl.classList.remove(tieColorClassName);\n popupTextEl.classList.remove(xColorClassName);\n popupTextEl.classList.remove(oColorClassName);\n\n /** Set player active states **/\n toggleActiveUsers(gameCount);\n initPlayerAlerts();\n \n /** Reset Tile UI states **/\n tileElems.forEach((node) => {\n /** Remove active class names **/\n node.classList.remove(xActiveClassName);\n node.classList.remove(oActiveClassName);\n\n if (isXActive) {\n node.classList.add(xHoverClassName);\n node.addEventListener('click', handleTileClick, false);\n return;\n }\n\n node.classList.add(oHoverClassName);\n node.addEventListener('click', handleTileClick, false);\n });\n }\n function toggleActiveUsers(gameCount) {\n let isEvenGameCount = (gameCount % 2 == 0);\n\n if (gameCount && isEvenGameCount) {\n isOActive = true;\n isXActive = false;\n return;\n } else if (gameCount && !isEvenGameCount) {\n isXActive = true;\n isOActive = false;\n return;\n }\n\n isXActive = !isXActive;\n isOActive = !isOActive;\n }\n function toggleHoverClassName(isXActive) {\n tileElems.forEach((node) => {\n /** Ignore selected tiles **/\n if (node.classList.contains(xActiveClassName) || node.classList.contains(oActiveClassName)) {\n return;\n }\n\n if (isXActive) {\n node.classList.remove(oHoverClassName);\n node.classList.add(xHoverClassName);\n return;\n }\n\n node.classList.remove(xHoverClassName);\n node.classList.add(oHoverClassName);\n })\n }\n function checkWinningCombinations(el) {\n const id = el.id.split(\"-\")[1];\n const itemMap = combinationMap[id];\n const activeClassName = isXActive ? xActiveClassName : isOActive ? oActiveClassName : \"\";\n const result = {\n className: activeClassName,\n combination: null,\n player: null,\n hasPlayerWon: false\n };\n\n itemMap.every((item) => {\n const placementsArr = item.split(\"-\");\n const placementA = document.querySelector(`#tile-${placementsArr[0]}`);\n const placementB = document.querySelector(`#tile-${placementsArr[1]}`);\n const placementC = document.querySelector(`#tile-${placementsArr[2]}`);\n const hasCombinationWon = !!(placementA.classList.contains(activeClassName) && \n placementB.classList.contains(activeClassName) && \n placementC.classList.contains(activeClassName));\n\n if (hasCombinationWon) {\n result.combination = item;\n result.hasPlayerWon = true;\n result.player = isXActive ? \"X\" : isOActive ? \"O\": null;\n return false;\n }\n\n return true;\n });\n\n console.log(\"result: \", result);\n return result;\n }\n function announceResult(obj, result) {\n let popupText, popupTextColor, resultEl, resultCounter;\n const isPlayerX = obj.player === xText;\n const isPlayerO = obj.player === oText;\n\n if (isPlayerX) {\n xWins++;\n resultCounter = xWins;\n resultEl = xWinsEl;\n } else if (isPlayerO) {\n oWins++;\n resultCounter = oWins;\n resultEl = oWinsEl;\n } else {\n gameTies++;\n resultCounter = gameTies;\n resultEl = gameTiesEl;\n }\n\n switch(result) {\n case \"TIE\":\n popupText = `This round is tied!`;\n popupTextColor = tieColorClassName;\n break;\n\n case \"WIN\":\n popupText = `${obj.player} wins this round!`;\n popupTextColor = `color-${obj.player.toLowerCase()}`;\n playAudio(applauseSoundPath);\n initConfetti();\n break;\n }\n\n tileElems.forEach((node) => {\n node.classList.remove(oHoverClassName);\n node.classList.remove(xHoverClassName);\n node.removeEventListener('click', handleTileClick, false);\n });\n\n popupTextEl.textContent = popupText;\n popupTextEl.classList.add(popupTextColor);\n resultEl.textContent = resultCounter;\n popupEl.style.zIndex = 100;\n hidePlayerAlert();\n }\n function handleTileClick(e) {\n const node = e.target;\n let combinationsResult = null;\n\n if (node.classList.contains(xActiveClassName) || node.classList.contains(oActiveClassName)) {\n return;\n }\n\n if (isXActive) {\n node.classList.add(xActiveClassName);\n node.classList.remove(xHoverClassName); \n node.textContent = xText;\n playAudio(xSoundPath);\n } else if (isOActive) {\n node.classList.add(oActiveClassName);\n node.classList.remove(oHoverClassName);\n node.textContent = oText;\n playAudio(oSoundPath);\n }\n\n gameMoves++;\n combinationsResult = checkWinningCombinations(node);\n /** Announce the game is Tied if gameMoves are 9 and no player has won. **/\n if (gameMoves == totalMoves && !combinationsResult.hasPlayerWon) {\n announceResult(combinationsResult, \"TIE\");\n return;\n }\n \n if (combinationsResult.hasPlayerWon) {\n announceResult(combinationsResult, \"WIN\");\n return;\n }\n\n toggleActiveUsers();\n toggleHoverClassName(isXActive);\n initPlayerAlerts();\n return;\n }\n function setDOMEvents() {\n restartGameEl.addEventListener('click', () => initInteraction(), false);\n alertCloseEl.addEventListener('click', () => hidePlayerAlert(), false);\n modeChangeEl.addEventListener('click', () => toggleDisplayMode(), false);\n }\n function toggleDisplayMode() {\n if (isDarkMode) {\n appWrapperEl.classList.remove(darkModeClassName);\n modeImageEl.setAttribute(\"width\", \"40\");\n modeImageEl.setAttribute(\"height\", \"40\");\n modeImageEl.setAttribute(\"title\", \"Switch to Dark Mode\");\n modeImageEl.src = darkModeImagePath;\n isDarkMode = !isDarkMode;\n return;\n }\n\n appWrapperEl.classList.add(darkModeClassName);\n modeImageEl.setAttribute(\"width\", \"45\");\n modeImageEl.setAttribute(\"height\", \"45\");\n modeImageEl.setAttribute(\"title\", \"Switch to Light Mode\");\n modeImageEl.src = lightModeImagePath;\n isDarkMode = !isDarkMode;\n }\n function initConfetti() {\n const count = 200,\n defaults = {\n origin: { y: 0.7 },\n };\n\n function fire(particleRatio, opts) {\n confetti(\n Object.assign({}, defaults, opts, {\n particleCount: Math.floor(count * particleRatio),\n })\n );\n }\n\n fire(0.25, {\n spread: 26,\n startVelocity: 55,\n });\n fire(0.2, {\n spread: 60,\n });\n fire(0.35, {\n spread: 100,\n decay: 0.91,\n scalar: 0.8,\n });\n fire(0.1, {\n spread: 120,\n startVelocity: 25,\n decay: 0.92,\n scalar: 1.2,\n });\n fire(0.1, {\n spread: 120,\n startVelocity: 45,\n });\n }\n function initPlayerAlerts() {\n let computedText = '';\n\n if (isXActive) {\n computedText = `${xText} turn to play!`;\n } else {\n computedText = `${oText} turn to play!`;\n }\n\n alertTextEl.textContent = computedText;\n showPlayerAlert();\n }\n function showPlayerAlert() {\n alertEl.classList.add(\"show\");\n }\n function hidePlayerAlert() {\n alertEl.classList.remove(\"show\");\n }\n function playAudio(file) {\n const audio = new Audio(file);\n\n audio\n .play()\n .catch((err) => {\n console.log(\"Audio is not played \", err);\n });\n }\n\n initInteraction();\n setDOMEvents();\n})();","module.exports = new __parcel__URL__(\"player-x-click.af6e08c2.mp3\").toString();","module.exports = new __parcel__URL__(\"player-o-click.908137e5.mp3\").toString();","module.exports = new __parcel__URL__(\"applause-cheer.a973b097.mp3\").toString();","module.exports = new __parcel__URL__(\"dark-mode.d3a35ea1.png\").toString();","module.exports = new __parcel__URL__(\"light-mode.0d2c3b71.png\").toString();"],"names":["$parcel$global","globalThis","$parcel$modules","$parcel$inits","parcelRequire","id","exports","init","module","call","err","Error","code","register","parcelRegister","Object","defineProperty","get","$18c11f3350a906ea$export$6503ec6e8aabbaf","set","v","enumerable","configurable","$18c11f3350a906ea$var$mapping","Map","baseUrl","manifest","i","length","path","URL","url","toString","JSON","parse","$ef0b7eda38450762$exports","$979e45545fb41b0c$exports","$9839198d020e05d2$exports","$abb1f5ecb202b013$exports","$02ed74011ffb8561$exports","gameCount","gameMoves","xWins","oWins","gameTies","isXActive","isOActive","isDarkMode","appWrapperEl","document","querySelector","tileElems","querySelectorAll","popupEl","popupTextEl","restartGameEl","xWinsEl","oWinsEl","gameTiesEl","alertEl","alertTextEl","alertCloseEl","modeChangeEl","modeImageEl","xHoverClassName","oHoverClassName","xActiveClassName","oActiveClassName","tieColorClassName","darkModeClassName","xSoundPath","oSoundPath","applauseSoundPath","darkModeImagePath","lightModeImagePath","combinationMap","initInteraction","style","zIndex","classList","remove","toggleActiveUsers","initPlayerAlerts","forEach","node","add","addEventListener","handleTileClick","isEvenGameCount","announceResult","obj","result","popupText","popupTextColor","resultEl","resultCounter","isPlayerX","player","isPlayerO","toLowerCase","playAudio","initConfetti","defaults","origin","y","fire","particleRatio","opts","confetti","assign","particleCount","Math","floor","count","spread","startVelocity","decay","scalar","removeEventListener","textContent","hidePlayerAlert","e","target","combinationsResult","contains","checkWinningCombinations","el","itemMap","split","activeClassName","className","combination","hasPlayerWon","every","item","placementsArr","placementA","placementB","placementC","console","log","computedText","file","audio","Audio","play","catch","toggleDisplayMode","setAttribute","src"],"version":3,"file":"index.d5f8f964.js.map"}