diff --git a/android-chrome-192x192.png b/android-chrome-192x192.png new file mode 100644 index 0000000..7fabb38 Binary files /dev/null and b/android-chrome-192x192.png differ diff --git a/android-chrome-512x512.png b/android-chrome-512x512.png new file mode 100644 index 0000000..6c47bef Binary files /dev/null and b/android-chrome-512x512.png differ diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000..6534042 Binary files /dev/null and b/apple-touch-icon.png differ diff --git a/apps.js b/apps.js new file mode 100644 index 0000000..6da3b43 --- /dev/null +++ b/apps.js @@ -0,0 +1,603 @@ +// Import the audio manager +import audioManager from './audio.js'; + +// Initialize variables +let players = []; +let currentPlayerIndex = 0; +let gameState = 'setup'; // setup, running, paused, over +let carouselPosition = 0; +let startX = 0; +let currentX = 0; + +// DOM Elements +const carousel = document.getElementById('carousel'); +const gameButton = document.getElementById('gameButton'); +const setupButton = document.getElementById('setupButton'); +const addPlayerButton = document.getElementById('addPlayerButton'); +const resetButton = document.getElementById('resetButton'); +const playerModal = document.getElementById('playerModal'); +const resetModal = document.getElementById('resetModal'); +const playerForm = document.getElementById('playerForm'); +const cancelButton = document.getElementById('cancelButton'); +const deletePlayerButton = document.getElementById('deletePlayerButton'); +const resetCancelButton = document.getElementById('resetCancelButton'); +const resetConfirmButton = document.getElementById('resetConfirmButton'); +const playerImage = document.getElementById('playerImage'); +const imagePreview = document.getElementById('imagePreview'); +const playerTimeContainer = document.getElementById('playerTimeContainer'); +const remainingTimeContainer = document.getElementById('remainingTimeContainer'); +const playerRemainingTime = document.getElementById('playerRemainingTime'); + +// Add sound toggle button +const createSoundToggleButton = () => { + const headerButtons = document.querySelector('.header-buttons'); + const soundButton = document.createElement('button'); + soundButton.id = 'soundToggleButton'; + soundButton.className = 'header-button'; + soundButton.title = 'Toggle Sound'; + soundButton.innerHTML = ''; + + soundButton.addEventListener('click', () => { + const isMuted = audioManager.toggleMute(); + soundButton.innerHTML = isMuted ? + '' : + ''; + + // Play feedback sound if unmuting + if (!isMuted) { + audioManager.play('buttonClick'); + } + }); + + headerButtons.prepend(soundButton); + + // Set initial icon state based on mute setting + if (audioManager.muted) { + soundButton.innerHTML = ''; + } +}; + +// Create the sound toggle button when page loads +createSoundToggleButton(); + +// Load data from localStorage or use defaults +function loadData() { + const savedData = localStorage.getItem('chessTimerData'); + if (savedData) { + const parsedData = JSON.parse(savedData); + players = parsedData.players; + gameState = parsedData.gameState || 'setup'; + currentPlayerIndex = parsedData.currentPlayerIndex || 0; + } else { + // Default players if no saved data + players = [ + { id: 1, name: 'Player 1', timeInSeconds: 300, remainingTime: 300, image: null }, + { id: 2, name: 'Player 2', timeInSeconds: 300, remainingTime: 300, image: null } + ]; + saveData(); + } + renderPlayers(); + updateGameButton(); +} + +// Save data to localStorage +function saveData() { + const dataToSave = { + players, + gameState, + currentPlayerIndex + }; + localStorage.setItem('chessTimerData', JSON.stringify(dataToSave)); +} + +// Render players to carousel +function renderPlayers() { + carousel.innerHTML = ''; + + players.forEach((player, index) => { + const card = document.createElement('div'); + card.className = `player-card ${index === currentPlayerIndex ? 'active-player' : 'inactive-player'}`; + + const minutes = Math.floor(player.remainingTime / 60); + const seconds = player.remainingTime % 60; + const timeString = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; + + // Create timer element with appropriate classes + const timerClasses = []; + + // Add timer-active class if this is current player and game is running + if (index === currentPlayerIndex && gameState === 'running') { + timerClasses.push('timer-active'); + } + + // Add timer-finished class if player has no time left + if (player.remainingTime <= 0) { + timerClasses.push('timer-finished'); + } + + card.innerHTML = ` +