Family Travel Packing List Generator

Family Travel Packing List Generator

Trip Details

Your Packing Checklist

Select your trip details to generate a customized packing list.

Final Packing List

Your finalized packing list will appear here once you select items from the generator.

No items have been checked off yet. Go to the generator and select items to pack.

'; return; } packingData.categories.forEach(category => { const itemsInCategory = packedItems.filter(item => item.category === category); if (itemsInCategory.length > 0) { const categoryDiv = document.createElement('div'); categoryDiv.className = 'list-category'; let itemsHTML = `

${category}

`; itemsInCategory.forEach(item => { itemsHTML += `
`; }); categoryDiv.innerHTML = itemsHTML; finalListContainer.appendChild(categoryDiv); } }); } // --- TAB & NAVIGATION --- window.openTab = function(evt, tabName) { if (tabName === 'final') renderFinalList(); const tabContents = document.getElementsByClassName("tab-content"); Array.from(tabContents).forEach(tab => tab.style.display = "none"); const tabButtons = document.getElementsByClassName("tab-btn"); Array.from(tabButtons).forEach(btn => btn.classList.remove("active")); document.getElementById(tabName).style.display = "block"; if (evt) { evt.currentTarget.classList.add("active"); } else { const btnToActivate = Array.from(tabButtons).find(btn => btn.getAttribute('onclick').includes(`'${tabName}'`)); if (btnToActivate) btnToActivate.classList.add("active"); } updateNavButtons(); } window.navigateTabs = function(direction) { const tabs = Array.from(document.querySelectorAll('.tab-btn')); const activeTabIndex = tabs.findIndex(tab => tab.classList.contains('active')); let newIndex = (direction === 'next') ? (activeTabIndex + 1) % tabs.length : (activeTabIndex - 1 + tabs.length) % tabs.length; tabs[newIndex].click(); } function updateNavButtons() { const tabs = Array.from(document.querySelectorAll('.tab-btn')); const activeTabIndex = tabs.findIndex(tab => tab.classList.contains('active')); document.getElementById('prev-btn').style.visibility = activeTabIndex === 0 ? 'hidden' : 'visible'; document.getElementById('next-btn').style.visibility = activeTabIndex === tabs.length - 1 ? 'hidden' : 'visible'; } // --- PDF DOWNLOAD --- if(downloadPdfBtn) { downloadPdfBtn.addEventListener('click', function() { const { jsPDF } = window.jspdf; const contentToDownload = document.getElementById('final-list-to-download'); if (!contentToDownload || currentPackingList.filter(i => i.packed).length === 0) { console.warn("Please select items to pack before downloading."); return; } const originalButtonText = downloadPdfBtn.innerHTML; downloadPdfBtn.innerHTML = 'Generating...'; downloadPdfBtn.disabled = true; html2canvas(contentToDownload, { scale: 2, useCORS: true }).then(canvas => { const imgData = canvas.toDataURL('image/png'); const pdf = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const imgProps = pdf.getImageProperties(imgData); const imgHeight = (imgProps.height * pdfWidth) / imgProps.width; pdf.addImage(imgData, 'PNG', 10, 10, pdfWidth - 20, imgHeight > 0 ? imgHeight - 20 : 0); pdf.save('Family-Packing-List.pdf'); }).catch(err => { console.error("Error generating PDF:", err); }).finally(() => { downloadPdfBtn.innerHTML = originalButtonText; downloadPdfBtn.disabled = false; }); }); } // --- INITIALIZATION --- function initializeTool() { populateControls(); generateList(); updateNavButtons(); } // This tool does not have a config tab, so no call to renderConfig() is needed. initializeTool(); });
Scroll to Top