Augmented Reality (AR) Product Showcase

Augmented Reality (AR) Product Showcase

Visualize and interact with your products in a simulated AR environment.

${currentProduct.description}

${colorSwatchesHtml}
`; updateProductView(); attachDashboardListeners(); }; const updateProductView = () => { const product3d = document.getElementById('product-3d'); if (!product3d) return; const currentProduct = appData.products.find(p => p.id === appData.showcase.productId); const currentColorHex = currentProduct.colors[appData.showcase.color]; product3d.innerHTML = currentProduct.svg; const svgColorPart = product3d.querySelector('.product-svg-main-color'); if(svgColorPart) svgColorPart.style.fill = currentColorHex; product3d.style.transform = `rotateY(${appData.showcase.rotation}deg)`; }; const renderDataConfig = () => { const configContent = document.getElementById('content-data-configuration'); if (!configContent) return; const productSelectors = appData.products.map(p => ``).join(''); configContent.innerHTML = `

Showcase Settings

Edit Product Details

`; renderProductEditForm(); attachConfigListeners(); }; const renderProductEditForm = () => { const formContainer = document.getElementById('product-edit-form'); if (!formContainer) return; const productToEdit = appData.products.find(p => p.id === appData.showcase.productId); const colorsHtml = Object.entries(productToEdit.colors).map(([name, hex]) => `
`).join(''); formContainer.innerHTML = `
${colorsHtml}
`; lucide.createIcons(); attachEditFormListeners(); } // --- EVENT HANDLERS & LOGIC --- const attachDashboardListeners = () => { document.getElementById('rotation-slider').addEventListener('input', e => { appData.showcase.rotation = e.target.value; updateProductView(); }); document.querySelectorAll('.color-swatch').forEach(swatch => { swatch.addEventListener('click', e => { appData.showcase.color = e.currentTarget.dataset.colorName; document.getElementById('color-name-label').textContent = appData.showcase.color; document.querySelectorAll('.color-swatch').forEach(s => s.classList.remove('selected')); e.currentTarget.classList.add('selected'); updateProductView(); }); }); document.getElementById('download-pdf-btn').addEventListener('click', generatePdf); }; const attachConfigListeners = () => { document.getElementById('product-select').addEventListener('change', e => { appData.showcase.productId = parseInt(e.target.value); const newProduct = appData.products.find(p => p.id === appData.showcase.productId); appData.showcase.color = Object.keys(newProduct.colors)[0]; // Reset to first color appData.showcase.rotation = 0; renderDashboard(); renderProductEditForm(); }); }; const attachEditFormListeners = () => { const handler = () => { const product = appData.products.find(p => p.id === appData.showcase.productId); product.name = document.getElementById('edit-name').value; product.price = parseFloat(document.getElementById('edit-price').value); product.description = document.getElementById('edit-description').value; renderDashboard(); }; document.getElementById('edit-name').addEventListener('change', handler); document.getElementById('edit-price').addEventListener('change', handler); document.getElementById('edit-description').addEventListener('change', handler); document.querySelectorAll('.edit-color-hex').forEach(input => input.addEventListener('input', (e) => { const product = appData.products.find(p => p.id === appData.showcase.productId); product.colors[e.target.dataset.name] = e.target.value; if(appData.showcase.color === e.target.dataset.name) renderDashboard(); })); // ... more complex logic for changing names and adding/removing colors would go here }; const generatePdf = () => { loadingOverlay.style.display = 'flex'; const { jsPDF } = window.jspdf; const currentProduct = appData.products.find(p => p.id === appData.showcase.productId); document.getElementById('pdf-generated-date').textContent = new Date().toLocaleString(); document.getElementById('pdf-product-name').textContent = currentProduct.name; const pdfHeader = document.getElementById('pdf-header'); pdfHeader.classList.remove('hidden'); const fullContent = document.getElementById('pdf-content-area'); html2canvas(fullContent, { scale: 2, useCORS: true, logging: false, windowWidth: 1200 }) .then(canvas => { pdfHeader.classList.add('hidden'); const imgData = canvas.toDataURL('image/jpeg', 0.9); const pdf = new jsPDF({ orientation: 'landscape', unit: 'px', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const imgProps = pdf.getImageProperties(imgData); const imgHeight = (imgProps.height * pdfWidth) / imgProps.width; pdf.addImage(imgData, 'JPEG', 0, 0, pdfWidth, imgHeight); pdf.save(`Product-Sheet-${currentProduct.name.replace(/\s/g, '-')}.pdf`); loadingOverlay.style.display = 'none'; }).catch(err => { console.error("PDF generation failed:", err); pdfHeader.classList.add('hidden'); loadingOverlay.style.display = 'none'; alert('An error occurred generating the PDF.'); }); }; // --- TAB NAVIGATION & INITIALIZATION --- const switchTab = (tabIndex) => { activeTabIndex = tabIndex; document.querySelectorAll('.tab-btn').forEach((btn, i) => btn.classList.toggle('active', i === tabIndex)); document.querySelectorAll('.tab-content').forEach((content, i) => content.classList.toggle('hidden', i !== tabIndex)); updateNavButtons(); }; const updateNavButtons = () => { prevTabBtn.disabled = activeTabIndex === 0; nextTabBtn.disabled = activeTabIndex === tabIdentifiers.length - 1; }; const initializeUI = () => { const tabs = [ { name: 'AR Showcase', id: 'ar-showcase' }, { name: 'Data Configuration', id: 'data-configuration' } ]; tabIdentifiers = tabs.map(t => t.id); tabsContainer.innerHTML = tabs.map(tab => ``).join(''); mainContent.innerHTML = tabs.map(tab => `
`).join(''); tabs.forEach((tab, index) => { document.getElementById(`tab-${tab.id}`).addEventListener('click', () => switchTab(index)); }); renderDashboard(); renderDataConfig(); switchTab(0); }; initializeUI(); prevTabBtn.addEventListener('click', () => { if (activeTabIndex > 0) switchTab(activeTabIndex - 1); }); nextTabBtn.addEventListener('click', () => { if (activeTabIndex < tabIdentifiers.length - 1) switchTab(activeTabIndex + 1); }); });
Scroll to Top