// Constants const SAVED_IMAGES_KEY = 'savedImages'; const RANDOM_PROMPTS = [ 'A magical forest with glowing mushrooms and fairy lights', 'A futuristic cyberpunk city at night with neon lights', 'A serene Japanese garden with cherry blossoms', 'An underwater city with bioluminescent creatures', 'A steampunk airship flying through clouds at sunset', 'A cosmic scene with colorful nebulas and galaxies', 'A mystical ancient temple hidden in mountains', 'A surreal floating island with waterfalls', 'A crystal cave with magical gemstones', 'An enchanted library with floating books' ]; // Load saved images from local storage const loadSavedImages = () => { try { return JSON.parse(localStorage.getItem(SAVED_IMAGES_KEY)) || []; } catch (error) { console.error('Error loading saved images:', error); return []; } }; // Delete image from saved images const deleteImage = (imageUrl) => { try { const savedImages = loadSavedImages(); const updatedImages = savedImages.filter(img => img.url !== imageUrl); localStorage.setItem(SAVED_IMAGES_KEY, JSON.stringify(updatedImages)); renderSavedImages(); } catch (error) { console.error('Error deleting image:', error); } }; // Render saved images section const renderSavedImages = () => { const galleryGrid = document.querySelector('#gallery-grid'); if (!galleryGrid) return; const savedImages = loadSavedImages(); galleryGrid.innerHTML = ''; savedImages.forEach(image => { const galleryItem = document.createElement('div'); galleryItem.className = 'gallery-item'; const img = document.createElement('img'); img.src = image.url; img.alt = image.prompt || 'Generated image'; const overlay = document.createElement('div'); overlay.className = 'overlay'; const deleteBtn = document.createElement('button'); deleteBtn.textContent = '🗑️ Delete'; deleteBtn.onclick = () => deleteImage(image.url); const downloadBtn = document.createElement('button'); downloadBtn.textContent = '💾 Download'; downloadBtn.onclick = () => { const link = document.createElement('a'); link.href = image.url; link.download = `generated-image-${Date.now()}.png`; link.click(); }; overlay.appendChild(deleteBtn); overlay.appendChild(downloadBtn); galleryItem.appendChild(img); galleryItem.appendChild(overlay); galleryGrid.appendChild(galleryItem); }); }; // Save image to local storage const saveImageToStorage = (imageUrl, prompt) => { try { const savedImages = loadSavedImages(); savedImages.unshift({ url: imageUrl, prompt, timestamp: Date.now() }); localStorage.setItem(SAVED_IMAGES_KEY, JSON.stringify(savedImages)); renderSavedImages(); } catch (error) { console.error('Error saving image:', error); } }; // Function to get random prompt const getRandomPrompt = () => { return RANDOM_PROMPTS[Math.floor(Math.random() * RANDOM_PROMPTS.length)]; }; // Function to generate image URL const generateImageUrl = (prompt) => { const encodedPrompt = encodeURIComponent(prompt); return `https://image.pollinations.ai/prompt/${encodedPrompt}`; }; // Function to create gallery item const createGalleryItem = (imageUrl, prompt, timestamp) => { const galleryItem = document.createElement('div'); galleryItem.className = 'gallery-item loading'; const img = document.createElement('img'); img.src = imageUrl; img.alt = prompt; const overlay = document.createElement('div'); overlay.className = 'overlay'; // Add prompt text display const promptText = document.createElement('div'); promptText.className = 'prompt-text'; promptText.textContent = prompt; // Add watermark const watermark = document.createElement('div'); watermark.className = 'watermark'; watermark.textContent = 'Creativ'; const saveBtn = document.createElement('button'); saveBtn.innerHTML = ' Save'; saveBtn.onclick = () => saveImageToStorage(imageUrl, prompt); const removeBtn = document.createElement('button'); removeBtn.innerHTML = ' Remove'; removeBtn.onclick = () => deleteImage(imageUrl); overlay.appendChild(saveBtn); galleryItem.appendChild(img); galleryItem.appendChild(promptText); galleryItem.appendChild(watermark); galleryItem.appendChild(overlay); img.onload = () => { galleryItem.classList.remove('loading'); // Auto-save the image when it's generated saveImageToStorage(imageUrl, prompt); }; return galleryItem; }; // Initialize the page document.addEventListener('DOMContentLoaded', () => { const menuToggle = document.getElementById('menu-toggle'); const navLinks = document.getElementById('nav-links'); const promptInput = document.getElementById('prompt-input'); const generateBtn = document.getElementById('generate-btn'); const galleryGrid = document.getElementById('gallery-grid'); if (menuToggle && navLinks) { menuToggle.addEventListener('click', () => { menuToggle.classList.toggle('active'); navLinks.classList.toggle('active'); }); // Close menu when clicking outside document.addEventListener('click', (e) => { if (!menuToggle.contains(e.target) && !navLinks.contains(e.target) && navLinks.classList.contains('active')) { menuToggle.classList.remove('active'); navLinks.classList.remove('active'); } }); // Close menu when clicking on a link const navLinksElements = navLinks.querySelectorAll('a'); navLinksElements.forEach(link => { link.addEventListener('click', () => { menuToggle.classList.remove('active'); navLinks.classList.remove('active'); }); }); } if (promptInput && generateBtn && galleryGrid) { // Add random prompt button first const randomBtn = document.createElement('button'); randomBtn.className = 'add-btn'; randomBtn.textContent = 'Random'; randomBtn.style.marginLeft = '0.5rem'; generateBtn.parentNode.insertBefore(randomBtn, generateBtn.nextSibling); // Update generate button icon based on input state const updateGenerateButton = () => { const hasInput = promptInput.value.trim().length > 0; generateBtn.innerHTML = hasInput ? ' Generate' : ' Generate'; randomBtn.style.display = hasInput ? 'none' : 'inline-block'; }; promptInput.addEventListener('input', updateGenerateButton); updateGenerateButton(); // Initial state // Function to generate image const generateImage = () => { const prompt = promptInput.value.trim(); if (!prompt) { alert('Please enter a prompt to generate an image'); return; } const imageUrl = generateImageUrl(prompt); const galleryItem = createGalleryItem(imageUrl, prompt); // Add loading spinner const loadingSpinner = document.createElement('div'); loadingSpinner.className = 'loading-spinner'; galleryItem.appendChild(loadingSpinner); // Insert the new image at the beginning of the gallery galleryGrid.insertBefore(galleryItem, galleryGrid.firstChild); // Clear the input promptInput.value = ''; updateGenerateButton(); // Update button state after clearing input }; // Event listeners randomBtn.addEventListener('click', () => { promptInput.value = getRandomPrompt(); updateGenerateButton(); // Update button state after setting random prompt }); generateBtn.addEventListener('click', generateImage); // Load saved images renderSavedImages(); } });