diff --git a/app.js b/app.js deleted file mode 100644 index e320711..0000000 --- a/app.js +++ /dev/null @@ -1,273 +0,0 @@ -// Define setTheme globally to handle theme changes -window.setTheme = function setTheme(theme) { - document.body.className = ''; // Clear existing themes - document.body.classList.add(theme); - - // Save the selected theme to localStorage - localStorage.setItem('selectedTheme', theme); -}; - -let cardList = []; -let soundThreshold = 1.00; // Default sound threshold - -// Make toggleMenu globally accessible -window.toggleMenu = function toggleMenu() { - const menuContent = document.getElementById('menu-content'); - menuContent.classList.toggle('show'); -}; - -document.addEventListener('DOMContentLoaded', () => { - const savedTheme = localStorage.getItem('selectedTheme'); - if (savedTheme) { - setTheme(savedTheme); - } - - const savedThreshold = localStorage.getItem('soundThreshold'); - if (savedThreshold) { - soundThreshold = parseFloat(savedThreshold); - document.getElementById('sound-threshold').value = savedThreshold; - } - - document.getElementById('add-card-button').addEventListener('click', addCard); - document.getElementById('download-csv-button').addEventListener('click', downloadCSV); - - document.getElementById('card-name').addEventListener('input', async function() { - const query = this.value; - const suggestions = await fetchCardSuggestions(query); - const suggestionsDiv = document.getElementById('suggestions'); - suggestionsDiv.innerHTML = ''; - suggestions.forEach(suggestion => { - const div = document.createElement('div'); - div.textContent = suggestion; - div.onclick = () => { - document.getElementById('card-name').value = suggestion; - suggestionsDiv.innerHTML = ''; - }; - suggestionsDiv.appendChild(div); - }); - }); - - // Update sound threshold based on user input - document.getElementById('sound-threshold').addEventListener('input', (event) => { - soundThreshold = parseFloat(event.target.value); - localStorage.setItem('soundThreshold', soundThreshold); // Save the threshold to localStorage - }); - - // Check and apply dark mode - const isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; - if (isDarkMode) { - document.body.classList.add('dark-mode'); - } -}); - -async function fetchCardSuggestions(query) { - try { - const response = await fetch(`https://api.scryfall.com/cards/autocomplete?q=${encodeURIComponent(query)}`); - if (!response.ok) { - throw new Error('Network response was not ok'); - } - const data = await response.json(); - return data.data; - } catch (error) { - console.error('Fetch error:', error); - return []; - } -} - -document.getElementById('card-name').addEventListener('input', async function() { - const query = this.value.trim(); - if (query.length < 2) { // Only search for queries longer than 1 character - document.getElementById('suggestions').innerHTML = ''; - return; - } - const suggestions = await fetchCardSuggestions(query); - const suggestionsDiv = document.getElementById('suggestions'); - suggestionsDiv.innerHTML = ''; // Clear previous suggestions - - suggestions.forEach(suggestion => { - const div = document.createElement('div'); - div.textContent = suggestion; - div.onclick = () => { - document.getElementById('card-name').value = suggestion; - suggestionsDiv.innerHTML = ''; // Clear suggestions after selection - }; - suggestionsDiv.appendChild(div); - }); -}); - - -async function fetchCardDetails(cardName, setCode) { - // Use the Scryfall 'named' endpoint to fetch the exact card by name and set code - const response = await fetch(`https://api.scryfall.com/cards/named?exact=${encodeURIComponent(cardName)}&set=${encodeURIComponent(setCode)}`); - const data = await response.json(); - - console.log('Fetched Data from Scryfall:', data); // Debugging: Log the fetched data - - // Return the relevant card details - return { - set: data.set.toUpperCase(), - card_id: data.collector_number, - mana_cost: data.mana_cost || 'N/A', - power: data.power || 'N/A', - toughness: data.toughness || 'N/A', - type: data.type_line.split('—')[0].trim(), - rarity: data.rarity || 'N/A', - price: data.prices.usd || '0.00', - imageUrl: data.image_uris ? data.image_uris.small : null, - name: data.name - }; -} - -async function addCard() { - const cardName = document.getElementById('card-name').value; - const setCodeInput = document.getElementById('set-code'); - const cardIdInput = document.getElementById('card-id'); - - // Fetch card details using the card name and set code - let setCode = setCodeInput.value; - let cardId = cardIdInput.value; - - // Always fetch card details - const cardDetails = await fetchCardDetails(cardName, setCode); - - if (cardDetails) { - // If set code or card ID is not filled, auto-fill them - if (!setCode) { - setCode = cardDetails.set; - setCodeInput.value = setCode; - } - if (!cardId) { - cardId = cardDetails.card_id; - cardIdInput.value = cardId; - } - - // Update card details with either user input or fetched data - updateCardDetails({ - name: cardName, - set: setCode, - card_id: cardId, - mana_cost: cardDetails.mana_cost, - power: cardDetails.power, - toughness: cardDetails.toughness, - type: cardDetails.type, - rarity: cardDetails.rarity, - price: cardDetails.price, - imageUrl: cardDetails.imageUrl - }); - } else { - alert("Card not found with the given name."); - } -} - - -function updateCardDetails(printing) { - document.getElementById('set-code').value = printing.set; - document.getElementById('card-id').value = printing.card_id; - - const quantity = document.getElementById('quantity').value; - const foil = document.getElementById('foil').value; - - const cardData = { - name: document.getElementById('card-name').value, - set: printing.set, - card_id: printing.card_id, - quantity: quantity, - foil: foil, - mana_type: printing.mana_cost, - power: printing.power, - toughness: printing.toughness, - type: printing.type, - rarity: printing.rarity - }; - - cardList.push(cardData); - - // Update the textarea with the new card information - let csvContent = generateCSVContent(); - document.getElementById('csv-output').value = csvContent; - - // Show the card image, name, and price in the dissolving popup - showCardPopup(cardData.name, printing.imageUrl, printing.price); -} - -function generateCSVContent() { - let csvContent = "Card Name,Set,Card ID,Quantity,Foil,Mana Type,Power,Toughness,Type,Rarity\n"; - cardList.forEach(card => { - const escapedValues = [ - card.name, - card.set, - card.card_id, - card.quantity, - card.foil, - card.mana_type, - card.power, - card.toughness, - card.type, - card.rarity - ].map(value => `"${value.replace(/"/g, '""')}"`); // Escape any existing quotes by doubling them - csvContent += escapedValues.join(",") + "\n"; - }); - return csvContent; -} - -async function showCardPopup(cardName, imageUrl, price) { - const cardPopup = document.getElementById('card-popup'); - cardPopup.innerHTML = ` -
- ${cardName} -
- ${cardName} -
- Price: $${price} -
- `; - cardPopup.style.display = 'block'; - cardPopup.style.opacity = 1; - - if (parseFloat(price) >= soundThreshold) { - playSound(); - } - - // Dissolve the popup after a few seconds - setTimeout(() => { - cardPopup.style.opacity = 0; - setTimeout(() => { - cardPopup.style.display = 'none'; - }, 500); - }, 3000); -} - -function playSound() { - const audio = new Audio('cash-money.mp3'); - audio.play(); -} - -function getRandomWordsFromFile() { - let randomWordsSelected = []; - for (let i = 0; i < 3; i++) { // Get three random words - const randomIndex = Math.floor(Math.random() * randomWords.length); - randomWordsSelected.push(randomWords[randomIndex]); - } - return randomWordsSelected.join('-'); -} - -async function downloadCSV() { - const csvContent = generateCSVContent(); - const randomFileName = getRandomWordsFromFile(); - - // Create a blob with the CSV content - const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); - const url = URL.createObjectURL(blob); - - // Create a temporary link element - const link = document.createElement("a"); - link.setAttribute("href", url); - link.setAttribute("download", `${randomFileName}.csv`); - document.body.appendChild(link); - - // Trigger the download - link.click(); - - // Clean up and remove the link - document.body.removeChild(link); -} diff --git a/cash-money.mp3 b/cash-money.mp3 deleted file mode 100644 index 04abc8e..0000000 Binary files a/cash-money.mp3 and /dev/null differ diff --git a/icon.png b/icon.png deleted file mode 100644 index ec545cd..0000000 Binary files a/icon.png and /dev/null differ diff --git a/styles.css b/styles.css deleted file mode 100644 index b2f5033..0000000 --- a/styles.css +++ /dev/null @@ -1,306 +0,0 @@ -:root { - --background-color: #f0f0f0; - --text-color: #333; - --card-background: #ffffff; - --button-background: #007acc; - --button-hover: #005fa3; -} - -.material-theme { - --background-color: #ffffff; - --text-color: #000000; - --card-background: #f8f8f8; - --button-background: #6200ee; - --button-hover: #3700b3; -} - -.theme-white { - --background-color: #f9f8f6; - --text-color: #1e1e1e; - --card-background: #ffffff; - --button-background: #e5e5e5; - --button-hover: #cccccc; -} - -.theme-blue { - --background-color: #d7e7f9; - --text-color: #002d72; - --card-background: #e0f2ff; - --button-background: #007acc; - --button-hover: #005fa3; -} - -.theme-black { - --background-color: #333333; - --text-color: #ffffff; - --card-background: #444444; - --button-background: #1f1f1f; - --button-hover: #000000; -} - -.theme-red { - --background-color: #fbe4e4; - --text-color: #8b0000; - --card-background: #ffe5e5; - --button-background: #d32f2f; - --button-hover: #b71c1c; -} - -.theme-green { - --background-color: #e7f4e7; - --text-color: #004d00; - --card-background: #e0ffe0; - --button-background: #388e3c; - --button-hover: #2e7d32; -} - -@media (prefers-color-scheme: dark) { - .theme-white { - --background-color: #1e1e1e; - --text-color: #ffffff; - --card-background: #333333; - --button-background: #555555; - --button-hover: #777777; - } - - .theme-blue { - --background-color: #001f3f; - --text-color: #ffffff; - --card-background: #002d72; - --button-background: #005fa3; - --button-hover: #007acc; - } - - .theme-black { - --background-color: #000000; - --text-color: #e5e5e5; - --card-background: #1c1c1c; - --button-background: #333333; - --button-hover: #555555; - } - - .theme-red { - --background-color: #330000; - --text-color: #ffaaaa; - --card-background: #8b0000; - --button-background: #b71c1c; - --button-hover: #d32f2f; - } - - .theme-green { - --background-color: #002200; - --text-color: #ccffcc; - --card-background: #004d00; - --button-background: #2e7d32; - --button-hover: #388e3c; - } - -} - - -@media (prefers-color-scheme: dark) { - :root { - --background-color: #1e1e1e; - --text-color: #ffffff; - --card-background: #2e2e2e; - --button-background: #1f6fb2; - --button-hover: #145b8c; - } -} - -.mana-icon { - font-family: 'mana', sans-serif; - font-size: 24px; - cursor: pointer; - padding: 5px; - margin-right: 10px; -} - -.mana-icon:hover { - opacity: 0.8; -} - -/* Ensure the menu follows the theme */ -body.theme-white .menu-content { - background-color: var(--background-color); - color: var(--text-color); -} - -body.theme-blue .menu-content { - background-color: var(--background-color); - color: var(--text-color); -} - -body.theme-black .menu-content { - background-color: var(--background-color); - color: var(--text-color); -} - -body.theme-red .menu-content { - background-color: var(--background-color); - color: var(--text-color); -} - -body.theme-green .menu-content { - background-color: var(--background-color); - color: var(--text-color); -} - -body { - font-family: 'Sorts Mill Goudy', serif; - background-color: var(--background-color); - color: var(--text-color); - margin: 0; - padding: 20px; -} - -.container { - max-width: 600px; - margin: 0 auto; - background-color: var(--card-background); - padding: 20px; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - border-radius: 8px; -} - -h1 { - text-align: center; - margin-bottom: 20px; -} - -form div { - margin-bottom: 15px; -} - -label { - display: block; - margin-bottom: 5px; -} - -input, select, textarea { - width: 100%; - padding: 8px; - box-sizing: border-box; - border: 1px solid #ccc; - border-radius: 4px; - background-color: var(--card-background); - color: var(--text-color); -} - -button { - display: block; - width: 100%; - padding: 10px; - background-color: var(--button-background); - color: white; - border: none; - border-radius: 4px; - cursor: pointer; - margin-top: 10px; -} - -button:hover { - background-color: var(--button-hover); -} - -#csv-output { - margin-top: 20px; - height: 200px; - background-color: var(--card-background); - color: var(--text-color); -} - -.card-popup { - position: fixed; - bottom: 20px; - right: 20px; - max-width: 20%; - z-index: 1000; - background-color: rgba(0, 0, 0, 0.7); - padding: 10px; - border-radius: 8px; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); - opacity: 0; - transition: opacity 0.5s ease-in-out; - display: none; -} - -.card-popup img { - width: 100%; - height: auto; - border-radius: 4px; -} - -@media (max-width: 600px) { - .card-popup { - max-width: 40%; - } -} - -@media (max-width: 400px) { - .card-popup { - max-width: 60%; - } -} - -.menu { - position: relative; - display: inline-block; -} - -.hamburger-menu { - cursor: pointer; - font-size: 30px; - color: var(--text-color); -} - -.menu-content { - display: none; - position: absolute; - top: 40px; - left: 0; - background-color: var(--background-color); - box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2); - padding: 10px; - z-index: 1; - min-width: 150px; - border-radius: 4px; -} - -.menu-content label, -.menu-content input { - color: var(--text-color); -} - -.menu-content.show { - display: block; -} - -/* Dark mode styles */ -body.dark-mode .menu-content { - background-color: #333; -} - -body.dark-mode .hamburger-menu, -body.dark-mode .menu-content label, -body.dark-mode .menu-content input { - color: white; -} - - -footer { - text-align: center; - font-size: 0.5rem; /* Smaller font size */ - color: #666; /* A lighter color for the text */ - margin-top: 0px; - padding: 1px; -} - -footer a { - color: #007acc; /* Link color matching the theme */ - text-decoration: none; -} - -footer a:hover { - text-decoration: underline; /* Underline on hover for emphasis */ -} diff --git a/sw.js b/sw.js deleted file mode 100644 index 27567c9..0000000 --- a/sw.js +++ /dev/null @@ -1,54 +0,0 @@ -// This is the service worker with the combined offline experience (Offline page + Offline copy of pages) - -const CACHE = "pwabuilder-offline-page"; - -importScripts('https://storage.googleapis.com/workbox-cdn/releases/5.1.2/workbox-sw.js'); - -// TODO: replace the following with the correct offline fallback page i.e.: const offlineFallbackPage = "offline.html"; -const offlineFallbackPage = "ToDo-replace-this-name.html"; - -self.addEventListener("message", (event) => { - if (event.data && event.data.type === "SKIP_WAITING") { - self.skipWaiting(); - } -}); - -self.addEventListener('install', async (event) => { - event.waitUntil( - caches.open(CACHE) - .then((cache) => cache.add(offlineFallbackPage)) - ); -}); - -if (workbox.navigationPreload.isSupported()) { - workbox.navigationPreload.enable(); -} - -workbox.routing.registerRoute( - new RegExp('/*'), - new workbox.strategies.StaleWhileRevalidate({ - cacheName: CACHE - }) -); - -self.addEventListener('fetch', (event) => { - if (event.request.mode === 'navigate') { - event.respondWith((async () => { - try { - const preloadResp = await event.preloadResponse; - - if (preloadResp) { - return preloadResp; - } - - const networkResp = await fetch(event.request); - return networkResp; - } catch (error) { - - const cache = await caches.open(CACHE); - const cachedResp = await cache.match(offlineFallbackPage); - return cachedResp; - } - })()); - } -}); \ No newline at end of file