diff --git a/assets/app.js b/assets/app.js index 9671c95..8f0eb62 100644 --- a/assets/app.js +++ b/assets/app.js @@ -48,7 +48,6 @@ let fireflyTimer = null; let fireflyActive = false; let titleClicks = []; let easterEggCooling = false; -let pendingImport = null; // --- Service Worker --- if ('serviceWorker' in navigator) { @@ -263,7 +262,7 @@ async function handleImport(event) { const text = await file.text(); const data = JSON.parse(text); if (!data.projects || !Array.isArray(data.projects)) throw new Error('Invalid file'); - pendingImport = data.projects; + projects = data.projects; if (typeof data.isDarkMode === 'boolean') { isDarkMode = data.isDarkMode; localStorage.setItem('crochetDarkMode', isDarkMode); @@ -272,7 +271,9 @@ async function handleImport(event) { animationsEnabled = data.animationsEnabled; localStorage.setItem('crochetAnimations', animationsEnabled); } - showImportSelection(); + localStorage.setItem('crochetCounters', JSON.stringify(projects)); + applyTheme(); + render(); } catch (err) { showAlert({ title: 'Import failed', text: err.message }); } @@ -283,47 +284,6 @@ if (importInput) { importInput.addEventListener('change', handleImport); } -function showImportSelection() { - if (!pendingImport || !Array.isArray(pendingImport) || !saveOverlay) return; - const importSelection = document.getElementById('importSelection'); - const importList = document.getElementById('importList'); - if (!importSelection || !importList) return; - importList.innerHTML = ''; - pendingImport.forEach((p, idx) => { - const item = document.createElement('label'); - item.className = 'save-item'; - item.innerHTML = ` - - ${p.name || 'Project ' + (idx + 1)} - `; - importList.appendChild(item); - }); - importSelection.classList.remove('hidden'); - saveOverlay.classList.add('active'); -} - -function cancelImportSelection() { - pendingImport = null; - const importSelection = document.getElementById('importSelection'); - const importList = document.getElementById('importList'); - if (importSelection) importSelection.classList.add('hidden'); - if (importList) importList.innerHTML = ''; -} - -function applyImportSelection() { - const importList = document.getElementById('importList'); - if (!importList || !pendingImport) { cancelImportSelection(); return; } - const inputs = importList.querySelectorAll('input[type="checkbox"]'); - const selected = Array.from(inputs).filter(i => i.checked).map(i => Number(i.dataset.idx)); - if (selected.length === 0) { cancelImportSelection(); return; } - const selectedProjects = pendingImport.filter((_, idx) => selected.includes(idx)); - projects = projects.concat(selectedProjects); - localStorage.setItem('crochetCounters', JSON.stringify(projects)); - render(); - cancelImportSelection(); - closeSaveModal(); - showAlert({ title: 'Import complete', text: `${selectedProjects.length} project(s) added.` }); -} function openSaveModal() { if (!saveOverlay || !saveList) return; saveList.innerHTML = ''; @@ -445,7 +405,6 @@ function handleAmbientDrift() { } handleAmbientDrift(); - const logoIcon = document.querySelector('.brand-icon'); if (logoIcon) { logoIcon.addEventListener('click', () => { diff --git a/assets/style.css b/assets/style.css index 85f0c12..745f347 100644 --- a/assets/style.css +++ b/assets/style.css @@ -232,7 +232,6 @@ h1 { .save-item input { width: 18px; height: 18px; } .save-actions { display: flex; justify-content: flex-end; gap: 8px; } .icon-woodland { width: 22px; height: 22px; } -.import-selection { margin-top: 12px; border-top: 1px dashed var(--border); padding-top: 10px; } .container { max-width: 1200px; @@ -244,28 +243,15 @@ h1 { } .projects-grid { - display: block; - column-width: 340px; - column-gap: 20px; - width: 100%; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); + gap: 20px; + align-items: start; /* Prevent shorter cards from stretching to tallest row mate */ } -@media (max-width: 768px) { +@media (min-width: 1280px) { .projects-grid { - column-width: 100%; - } -} - -@media (max-width: 1100px) { - .projects-grid { - display: block; - column-width: 340px; - column-gap: 20px; - } - .project-container { - break-inside: avoid; - margin: 0 0 20px; - width: auto; + grid-template-columns: repeat(3, minmax(320px, 1fr)); } } @@ -274,13 +260,11 @@ h1 { background: var(--card-bg); border-radius: 18px; padding: 5px 15px 15px 15px; - margin: 0 0 20px; + margin-bottom: 2rem; box-shadow: var(--shadow); transition: background-color 0.3s; border: 1px solid var(--border); - break-inside: avoid; - display: inline-block; - width: 100%; + z-index: 10; } .project-header {