365-1271

const urlParams = new URLSearchParams(window.location.search); if(urlParams.has('cliente')){ modoAdmin = false; const modoTop = document.getElementById('modoBtn'); const modoFoot = document.getElementById('modoBtnFooter'); if(modoTop) modoTop.style.display = 'none'; if(modoFoot) modoFoot.style.display = 'none'; } atualizarBannerUI(); } function salvarLocalStorage(){ try { localStorage.setItem('produtos', JSON.stringify(produtos)); localStorage.setItem('carrinho', JSON.stringify(carrinho)); const tituloEl = document.getElementById('tituloHeader'); localStorage.setItem('titulo', tituloEl ? tituloEl.textContent : 'Mercado Online'); const styles = getComputedStyle(document.body); const cores = { '--bg-color': styles.getPropertyValue('--bg-color').trim(), '--bg-card': styles.getPropertyValue('--bg-card').trim(), '--primary-color': styles.getPropertyValue('--primary-color').trim(), '--text-color': styles.getPropertyValue('--text-color').trim(), '--btn-text-color': styles.getPropertyValue('--btn-text-color').trim() }; localStorage.setItem('cores', JSON.stringify(cores)); localStorage.setItem('paginaAtual', paginaAtual); localStorage.setItem('bannerSrc', bannerSrc || ''); // salva categorias também salvarCategorias(); } catch(e){ console.warn('Erro ao salvar localStorage:', e); } } /* 🖼️ Banner – trocar/remover e UI admin */ function trocarBanner(){ const input = document.createElement('input'); input.type = 'file'; input.accept = 'image/*'; // abre galeria no celular input.style.display = 'none'; document.body.appendChild(input); input.addEventListener('change', ()=>{ const file = input.files && input.files[0]; if(file){ const reader = new FileReader(); reader.onload = e => { bannerSrc = e.target.result; const bannerEl = document.getElementById('topBanner'); if(bannerEl) bannerEl.src = bannerSrc; salvarLocalStorage(); }; reader.readAsDataURL(file); } document.body.removeChild(input); }, { once:true }); input.click(); } function removerBanner(){ if(confirm('Remover banner?')){ bannerSrc = ''; const bannerEl = document.getElementById('topBanner'); if(bannerEl) bannerEl.src = 'https://via.placeholder.com/1200x300.png?text=Seu+Banner+Aqui'; salvarLocalStorage(); } } function atualizarBannerUI(){ const actions = document.getElementById('bannerActions'); if(actions){ actions.style.display = modoAdmin ? 'flex' : 'none'; } const bannerImg = document.getElementById('topBanner'); if(bannerImg){ bannerImg.style.cursor = modoAdmin ? 'pointer' : 'default'; bannerImg.onclick = modoAdmin ? trocarBanner : null; } } /* Cria os botõezinhos de cor (22) */ function montarPaleta(containerId, cssVar, colorInputId, hexInputId){ const cont = document.getElementById(containerId); if(!cont) return; cont.innerHTML = ''; const previewId = (colorInputId && colorInputId.startsWith('cor')) ? ('preview'+colorInputId.slice(3)) : null; PALETA_CORES.forEach(hex=>{ const b = document.createElement('button'); b.title = hex; b.style.cssText = 'width:22px;height:22px;border:1px solid #999;border-radius:4px;cursor:pointer;'; b.style.background = hex; b.onclick = ()=>{ const inColor = document.getElementById(colorInputId); const inHex = document.getElementById(hexInputId); if(inColor) inColor.value = hex; if(inHex) inHex.value = hex; // atualiza preview, se existir if(previewId){ const pv = document.getElementById(previewId); if(pv) pv.style.background = hex; } mudarCor(cssVar, hex); salvarLocalStorage(); }; cont.appendChild(b); }); } /* ---------- NOVO: Formulário de Adicionar Card (Admin) ---------- */ function painelAdicionarCard(){ const wrap = document.createElement('div'); wrap.className = 'color-panel'; wrap.id = 'adminAddPanel'; wrap.innerHTML = ` ➕ Adicionar Card
`; return wrap; } function adicionarCard(){ const nome = (document.getElementById('newNome')?.value || '').trim(); const precoStr = (document.getElementById('newPreco')?.value || '').trim().replace(',','.'); const preco = parseFloat(precoStr); const categoria = (document.getElementById('newCategoria')?.value || (categorias[0]||'Sem categoria')); const imagem = (document.getElementById('newImagem')?.value || 'https://via.placeholder.com/150').trim(); const estoqueVal = parseInt(document.getElementById('newEstoque')?.value || '0', 10); const estoque = isNaN(estoqueVal) ? 0 : Math.max(0, estoqueVal); if(!nome){ alert('Digite o nome do produto.'); return; } if(isNaN(preco) || preco < 0){ alert('Digite um preço válido.'); return; } const novo = { id: uid(), nome, preco: preco.toFixed(2), categoria, imagem, estoque }; // Regras de página: se exceder 20 por página, automaticamente haverá uma nova página (via paginação global) produtos.push(novo); salvarLocalStorage(); // Leva o admin para a última página, onde o card ficou const totalPaginas = Math.max(1, Math.ceil(produtos.length / produtosPorPagina)); paginaAtual = totalPaginas; // Limpa o formulário const campos = ['newNome','newPreco','newImagem','newEstoque']; campos.forEach(id => { const el = document.getElementById(id); if(el) el.value = ''; }); renderProdutos(); alert('✅ Card adicionado com sucesso!'); } /* ---------- NOVO: Excluir Card + Gerenciar páginas ---------- */ function excluirCard(prodId){ const idx = produtos.findIndex(p => p.id === prodId); if(idx < 0) return; if(!confirm('Tem certeza que deseja excluir este card?')) return; produtos.splice(idx,1); salvarLocalStorage(); ajustarPaginacaoAposMudanca(); renderProdutos(); } function ajustarPaginacaoAposMudanca(){ // Remove páginas vazias: se a página atual ficou sem itens, recua const totalItens = produtos.length; const totalPaginas = Math.max(1, Math.ceil(Math.max(totalItens,1) / produtosPorPagina)); // Índices da página atual const start = (paginaAtual - 1) * produtosPorPagina; const end = Math.min(start + produtosPorPagina, totalItens); if(start >= totalItens && paginaAtual > 1){ paginaAtual = totalPaginas; // recua para a última página existente } if(totalItens === 0){ paginaAtual = 1; // sem itens, deixa em 1 } } /* Render geral (BUSCA + ORDENAÇÃO) */ function renderProdutos(){ salvarLocalStorage(); const main = document.getElementById('mainContent'); main.innerHTML=''; // Painéis do modo admin (título, banner, cores, pix) + NOVO painel "Adicionar Card" e painel de categorias if(modoAdmin){ // Painel de nome do mercado const tituloPanel = document.createElement('div'); tituloPanel.className='color-panel'; tituloPanel.innerHTML = ` `; main.appendChild(tituloPanel); const inputTitulo = document.getElementById('inputTitulo'); if(inputTitulo){ inputTitulo.value = document.getElementById('tituloHeader').textContent; inputTitulo.addEventListener('input', (e)=>{ document.getElementById('tituloHeader').textContent = e.target.value || 'Mercado Online'; salvarLocalStorage(); }); } // Painel do banner const bannerPanel = document.createElement('div'); bannerPanel.className = 'color-panel'; bannerPanel.innerHTML = ` 🖼️ Banner do topo
`; main.appendChild(bannerPanel); // Painel de cores (com previews maiores) const colorPanel = document.createElement('div'); colorPanel.className='color-panel'; colorPanel.innerHTML = `
`; main.appendChild(colorPanel); // Painel Pix const pixDiv = document.createElement('div'); pixDiv.className = 'color-panel'; pixDiv.innerHTML = ` `; main.appendChild(pixDiv); const pixSalvo = localStorage.getItem('pixKey'); if(pixSalvo){ const pk = document.getElementById('pixKey'); if(pk) pk.value = pixSalvo; } // NOVO: Painel de Adicionar Card // Antes de adicionar, precisamos garantir que o select de categorias esteja atualizado main.appendChild(painelAdicionarCard()); // popula o select com as categorias atuais const selNew = document.getElementById('newCategoria'); if(selNew) selNew.innerHTML = categorias.map(c=>``).join(''); // NOVO: Painel de CATEGORIAS (simples, recomendado) const catPanel = document.createElement('div'); catPanel.className = 'color-panel'; catPanel.id = 'painelCategorias'; catPanel.innerHTML = `📂 Categorias
`; main.appendChild(catPanel); // Inicializa controles de cor const varMap = { Bg: '--bg-color', Card: '--bg-card', Prim: '--primary-color', Texto: '--text-color', BtnTexto: '--btn-text-color' }; for(let tipo in varMap){ const cssVar = varMap[tipo]; const atual = getComputedStyle(document.body).getPropertyValue(cssVar).trim(); const inColor = document.getElementById('cor'+tipo); const inHex = document.getElementById('hex'+tipo); const preview = document.getElementById('preview'+tipo); if(inColor) inColor.value = atual; if(inHex) inHex.value = atual; if(preview) preview.style.background = atual; if(inColor) inColor.addEventListener('input', e=>{ if(inHex) inHex.value = e.target.value; if(preview) preview.style.background = e.target.value; mudarCor(cssVar, e.target.value); salvarLocalStorage(); }); if(inHex) inHex.addEventListener('input', e=>{ if(inColor) inColor.value = e.target.value; if(preview) preview.style.background = e.target.value; mudarCor(cssVar, e.target.value); salvarLocalStorage(); }); } montarPaleta('palBg', '--bg-color', 'corBg', 'hexBg'); montarPaleta('palCard', '--bg-card', 'corCard', 'hexCard'); montarPaleta('palPrim', '--primary-color', 'corPrim', 'hexPrim'); montarPaleta('palTexto', '--text-color', 'corTexto', 'hexTexto'); montarPaleta('palBtnTexto', '--btn-text-color', 'corBtnTexto', 'hexBtnTexto'); // renderiza lista de categorias no painel atualizarListaCategoriasAdmin(); } else { atualizarBannerUI(); } // Lista e paginação (com busca/ordem) const termo = (document.getElementById('searchInput')?.value || '') .toLowerCase() .normalize('NFD') .replace(/[\u0300-\u036f]/g,''); let listaFiltrada = produtos.filter(p=>{ const texto = (String(p.nome) + ' ' + String(p.categoria)) .toLowerCase() .normalize('NFD') .replace(/[\u0300-\u036f]/g,''); return texto.includes(termo); }); const criterio = document.getElementById('sortSelect')?.value || ''; if (criterio === "nome") { listaFiltrada.sort((a,b)=>a.nome.localeCompare(b.nome)); } else if (criterio === "preco") { listaFiltrada.sort((a,b)=>parseFloat(a.preco)-parseFloat(b.preco)); } else if (criterio === "categoria") { listaFiltrada.sort((a,b)=>a.categoria.localeCompare(b.categoria)); } const totalPaginas = Math.max(1, Math.ceil(listaFiltrada.length/produtosPorPagina)); if (paginaAtual > totalPaginas) paginaAtual = totalPaginas; if (paginaAtual < 1) paginaAtual = 1; const start=(paginaAtual-1)*produtosPorPagina; const end=Math.min(start+produtosPorPagina,listaFiltrada.length); const produtosPagina = listaFiltrada.slice(start,end); const container = document.createElement('div'); container.className='produtos'; produtosPagina.forEach((p)=>{ // garante campo estoque if(typeof p.estoque === 'undefined' || p.estoque === null) p.estoque = 0; const div=document.createElement('div'); div.className='produto'; div.dataset.id = p.id; // botão de adicionar fica desativado se estoque for 0 const botaoCompra = (p.estoque > 0) ? `` : ``; div.innerHTML=` ${p.nome}

${p.nome}

${p.categoria}

R$ ${p.preco}

Estoque: ${p.estoque}

${botaoCompra}
`; if(modoAdmin){ div.classList.add('admin'); } container.appendChild(div); if(modoAdmin){ // Edição inline (nome, preço, categoria, imagem) const img = div.querySelector('img'); const h3 = div.querySelector('h3'); const ps = div.querySelectorAll('p'); const pCat = ps[0]; const pPreco = ps[1]; h3.style.cursor='pointer'; h3.title='(Admin) Clique para editar o nome'; h3.addEventListener('click', ()=>{ const idx = produtos.findIndex(x=>x.id===p.id); const novo = prompt('Editar nome do produto:', produtos[idx].nome); if(novo!==null){ produtos[idx].nome = novo.trim() || produtos[idx].nome; salvarLocalStorage(); renderProdutos(); } }); pPreco.style.cursor='pointer'; pPreco.title='(Admin) Clique para editar o preço'; pPreco.addEventListener('click', ()=>{ const idx = produtos.findIndex(x=>x.id===p.id); const atual = produtos[idx].preco; const val = prompt('Editar preço (use ponto para decimais):', atual); if(val!==null){ const n = parseFloat(val.replace(',','.')); if(!isNaN(n)){ produtos[idx].preco = n.toFixed(2); salvarLocalStorage(); renderProdutos(); } else alert('Preço inválido.'); } }); pCat.style.cursor='pointer'; pCat.title='(Admin) Clique para editar a categoria'; pCat.addEventListener('click', ()=>{ const idx = produtos.findIndex(x=>x.id===p.id); const menu = categorias.map((c,i)=>`${i+1} - ${c}`).join('\n'); const atualIdx = Math.max(0, categorias.indexOf(produtos[idx].categoria)); const escolha = prompt(`Escolha a categoria:\n${menu}\n\nDigite o número da opção:`, (atualIdx+1).toString()); if(escolha!==null){ const num = parseInt(escolha,10); if(num>=1 && num<=categorias.length){ produtos[idx].categoria = categorias[num-1]; salvarLocalStorage(); renderProdutos(); } else { alert('Opção inválida.'); } } }); img.style.cursor='pointer'; img.title='(Admin) Clique para trocar a imagem'; img.addEventListener('click', ()=>{ const idx = produtos.findIndex(x=>x.id===p.id); const escolha = confirm("OK = enviar imagem do dispositivo\nCancelar = colar uma URL"); if(escolha){ const input = document.createElement('input'); input.type = 'file'; input.accept = 'image/*'; input.style.display = 'none'; document.body.appendChild(input); input.addEventListener('change', ()=>{ const file = input.files && input.files[0]; if(file){ const reader = new FileReader(); reader.onload = e=>{ produtos[idx].imagem = e.target.result; salvarLocalStorage(); renderProdutos(); document.body.removeChild(input); }; reader.readAsDataURL(file); } else { document.body.removeChild(input); } }, { once:true }); input.click(); } else { const url = prompt("Cole a URL da imagem:", produtos[idx].imagem || ''); if(url){ produtos[idx].imagem = url; salvarLocalStorage(); renderProdutos(); } } }); } }); main.appendChild(container); const pagDiv = document.createElement('div'); pagDiv.className='pagination'; pagDiv.innerHTML = ` `; main.appendChild(pagDiv); if(!modoAdmin){ const footer = document.createElement('div'); footer.className='cliente-footer'; footer.innerHTML = ` `; main.appendChild(footer); } if(modoAdmin){ atualizarBannerUI(); } else { atualizarBannerUI(); } } function atualizarListaCategoriasAdmin(){ const cont = document.getElementById('listaCategorias'); if(!cont) return; cont.innerHTML = ''; categorias.forEach((c, i)=>{ const row = document.createElement('div'); row.style.display = 'flex'; row.style.gap = '8px'; row.style.alignItems = 'center'; row.innerHTML = `${c}` + `` + ``; cont.appendChild(row); }); } function colarURLBanner(){ const url = prompt('Cole a URL da imagem do banner:'); if(url){ bannerSrc = url.trim(); const bannerEl = document.getElementById('topBanner'); if(bannerEl) bannerEl.src = bannerSrc; salvarLocalStorage(); } } /* ======================== CARRINHO COM QUANTIDADE + BOTÕES ➕/➖ ======================== */ function getProdutoById(id){ return produtos.find(p=>p.id===id); } function adicionarAoCarrinho(index){ // Mantido para compatibilidade antiga (index numérico, não usado no fluxo novo) const p = produtos[index]; if(p) adicionarAoCarrinhoPorId(p.id); } function adicionarAoCarrinhoPorId(prodId){ const p = getProdutoById(prodId); if(!p){ alert('Produto não encontrado.'); return; } if((p.estoque||0) <= 0){ alert('Produto esgotado.'); return; } const precoNum = parseFloat(p.preco); let item = carrinho.find(i => i.nome === p.nome); const currentQty = item ? parseInt(item.quantidade||1,10) : 0; if(currentQty + 1 > (p.estoque||0)){ alert('Não há estoque suficiente para adicionar mais unidades.'); return; } if(item){ item.quantidade = currentQty + 1; } else { carrinho.push({ nome: p.nome, preco: isNaN(precoNum) ? 0 : precoNum, quantidade: 1 }); } atualizarCarrinho(); salvarLocalStorage(); atualizarBadgeCarrinho(); alert(`${p.nome} adicionado ao carrinho`); } function atualizarCarrinho(){ const ul=document.getElementById('itensCarrinho'); if(!ul) return; ul.innerHTML=''; let total=0; carrinho.forEach((item,i)=>{ const li=document.createElement('li'); const unit = isNaN(parseFloat(item.preco)) ? 0 : parseFloat(item.preco); const qtd = parseInt(item.quantidade||1,10); const subtotal = unit * qtd; // botão ➖, input quantidade e botão ➕ li.innerHTML = ` ${item.nome} x R$ ${unit.toFixed(2)} = R$ ${subtotal.toFixed(2)} `; ul.appendChild(li); total+=subtotal; }); const totalEl = document.getElementById('totalCarrinho'); if(totalEl) totalEl.textContent=total.toFixed(2); const chkEl = document.getElementById('checkoutTotal'); if(chkEl) chkEl.textContent = total.toFixed(2); atualizarBadgeCarrinho(); } function alterarQuantidade(index, valor){ let qtd = parseInt(valor,10); if(isNaN(qtd) || qtd < 1) qtd = 1; if(!carrinho[index]) return; const item = carrinho[index]; const prod = produtos.find(p=>p.nome === item.nome); const estoqueDisp = prod ? (prod.estoque||0) : Infinity; if(qtd > estoqueDisp){ alert('Quantidade maior que o estoque disponível.'); qtd = estoqueDisp; } item.quantidade = qtd; atualizarCarrinho(); salvarLocalStorage(); } function removerItem(i){ const qtd = parseInt(carrinho[i].quantidade||1,10); if(qtd > 1){ carrinho[i].quantidade = qtd - 1; } else { carrinho.splice(i,1); } atualizarCarrinho(); salvarLocalStorage(); } function calcularTotalCarrinho(){ return carrinho.reduce((soma, item)=>{ const unit = isNaN(parseFloat(item.preco))?0:parseFloat(item.preco); const qtd = parseInt(item.quantidade||1,10); return soma + unit*qtd; }, 0); } function desistirCompra(){ if(confirm("Deseja realmente desistir da compra e voltar ao início?")){ carrinho = []; atualizarCarrinho(); salvarLocalStorage(); paginaAtual = 1; renderProdutos(); fecharCarrinho(); } } /* 🆕 SUBSTITUI: abrirPagamento antigo -> agora abre o modal */ function abrirPagamento(){ if(carrinho.length === 0){ alert("Seu carrinho está vazio!"); return; } let total = calcularTotalCarrinho().toFixed(2); const checkoutTotalEl = document.getElementById('checkoutTotal'); if(checkoutTotalEl) checkoutTotalEl.textContent = total; const modal = document.getElementById('checkoutModal'); if(modal){ modal.style.display = 'flex'; document.body.style.overflow = 'hidden'; } } function closeCheckout(){ const modal = document.getElementById('checkoutModal'); if(modal){ modal.style.display = 'none'; document.body.style.overflow = ''; } } function fecharCheckout(event){ if(!event || event.target.id==='checkoutModal'){ closeCheckout(); } } function gerarComprovante(){ let comprovante = "🧾 Comprovante de Pedido\n\n"; let total=0; carrinho.forEach(item=>{ const unit = isNaN(parseFloat(item.preco))?0:parseFloat(item.preco); const qtd = parseInt(item.quantidade||1,10); const sub = unit*qtd; comprovante += `${item.nome} (${qtd}x) - R$ ${sub.toFixed(2)}\n`; total+=sub; }); comprovante += `\nTotal: R$ ${total.toFixed(2)}\n`; const pixKey = localStorage.getItem('pixKey'); if(pixKey){ comprovante += `\n💳 Chave Pix para pagamento: ${pixKey}\n`; } else { comprovante += `\n⚠️ Nenhuma chave Pix cadastrada.\n`; } comprovante += `\nAcompanhe seu pedido: https://www.appcreator24.com/app3699570-ip7ogd`; alert(comprovante); try { navigator.clipboard.writeText(comprovante); } catch(e){} } function finalizarPedido(){ if(carrinho.length===0){ alert("Carrinho vazio!"); return; } // valida estoque antes de finalizar for(const item of carrinho){ const prod = produtos.find(p=>p.nome === item.nome); const qtd = parseInt(item.quantidade||1,10); if(prod && (prod.estoque||0) < qtd){ alert(`Estoque insuficiente para: ${prod.nome}. Ajuste a quantidade antes de finalizar.`); return; } } let texto="🛒 Pedido:\n"; let total=0; carrinho.forEach(item=>{ const unit = isNaN(parseFloat(item.preco))?0:parseFloat(item.preco); const qtd = parseInt(item.quantidade||1,10); const sub = unit*qtd; texto+=`${item.nome} (${qtd}x) - R$ ${sub.toFixed(2)}\n`; total+=sub; // reduz estoque const idx = produtos.findIndex(p=>p.nome === item.nome); if(idx>=0){ produtos[idx].estoque = Math.max(0,(produtos[idx].estoque||0) - qtd); } }); texto+=`\nTotal: R$ ${total.toFixed(2)}`; const pixKey = localStorage.getItem('pixKey'); if(pixKey){ texto+=`\n\n💳 Pague via Pix: ${pixKey}`; } const msg = encodeURIComponent(texto); window.open(`https://wa.me/?text=${msg}`,"_blank"); gerarComprovante(); carrinho = []; salvarLocalStorage(); renderProdutos(); fecharCarrinho(); } /* 🆕 Opções de pagamento no modal */ function finalizarPedidoPix(){ let total = calcularTotalCarrinho().toFixed(2); const pixKey = localStorage.getItem('pixKey'); if(pixKey){ alert("🔐 Pagamento via Pix\n\nChave Pix: " + pixKey + "\nValor total: R$ " + total); } else { alert("⚠️ Nenhuma chave Pix cadastrada!\nCadastre no modo administrador."); } closeCheckout(); } function finalizarPedidoEntrega(){ alert("✅ Pedido confirmado! Pague em Dinheiro ou Cartão na entrega."); closeCheckout(); } function finalizarPedidoCartao(){ alert("Você será redirecionado para o pagamento com cartão."); // 🔗 Substitua pelo seu link real de checkout do Mercado Pago window.open("https://www.mercadopago.com.br/checkout/v1/redirect?pref_id=SEU_ID_AQUI", "_blank"); closeCheckout(); } function abrirCarrinho(){ document.getElementById('carrinhoModal').style.display='flex'; atualizarCarrinho(); } function fecharCarrinho(event){ if(!event || event.target.id==='carrinhoModal'){ document.getElementById('carrinhoModal').style.display='none'; } } /* 🔇 alternarTema removido */ function mudarCor(varName,value){ try { document.documentElement.style.setProperty(varName,value); document.body.style.setProperty(varName,value); } catch(e){} } /* ✅ alternarModo agora também controla a classe .admin-mode no */ function alternarModo() { const modoTop = document.getElementById('modoBtn'); const modoFoot = document.getElementById('modoBtnFooter'); if (!modoAdmin) { const senha = prompt("Digite a senha para entrar no modo administrador:"); if (senha === "2010") { modoAdmin = true; if(modoTop) modoTop.textContent = 'Versão Cliente'; if(modoFoot) modoFoot.textContent = 'Versão Cliente'; document.body.classList.add('admin-mode'); // <<<<<< ADICIONA CLASSE atualizarBannerUI(); renderProdutos(); } else { alert("Senha incorreta!"); } } else { modoAdmin = false; if(modoTop) modoTop.textContent = 'Versão Administrador'; if(modoFoot) modoFoot.textContent = 'Versão Administrador'; document.body.classList.remove('admin-mode'); // <<<<<< REMOVE CLASSE atualizarBannerUI(); renderProdutos(); } } function enviarLink(){ const linkCliente = "https://www.appcreator24.com/app3699570-ip7ogd"; try { navigator.clipboard.writeText(linkCliente); } catch(e){} alert('Link do modo cliente copiado!'); } function enviarWhatsappEmail(){ const linkCliente = "https://www.appcreator24.com/app3699570-ip7ogd"; const texto = encodeURIComponent(`Confira nosso app de mercado: ${linkCliente}`); window.open(`https://wa.me/?text=${texto}`, '_blank'); } /* atualiza o texto dos botões de carrinho no footer (e no topo se existir) */ function atualizarBadgeCarrinho(){ const btnTop = document.getElementById("btnCarrinho"); const btnFoot = document.getElementById("btnCarrinhoFooter"); const qtd = carrinho.reduce((soma, i)=> soma + parseInt(i.quantidade||1,10), 0); const text = qtd > 0 ? `Carrinho 🛒 (${qtd})` : "Carrinho 🛒"; if(btnTop) btnTop.textContent = text; if(btnFoot) btnFoot.textContent = text; } function salvarPix(){ const pixKeyInput = document.getElementById('pixKey'); if(!pixKeyInput) return; const pixKey = pixKeyInput.value.trim(); if(pixKey === ""){ alert("Digite uma chave Pix válida!"); return; } localStorage.setItem('pixKey', pixKey); alert("✅ Chave Pix salva com sucesso!"); } // 🔎 eventos de busca e ordenação const searchEl = document.getElementById('searchInput'); if (searchEl) { searchEl.addEventListener('input', ()=>{ paginaAtual = 1; renderProdutos(); }); } const sortEl = document.getElementById('sortSelect'); if (sortEl) { sortEl.addEventListener('change', ()=>{ paginaAtual = 1; renderProdutos(); }); } /* 🎯 ZOOM — lógica (funciona só no modo cliente) */ const imgZoom = document.getElementById('imgZoom'); const imgZoomSrc = document.getElementById('imgZoomSrc'); const imgZoomClose = document.getElementById('imgZoomClose'); function abrirZoomImagem(src){ if(!imgZoom || !imgZoomSrc) return; imgZoomSrc.src = src; imgZoom.style.display = 'flex'; document.body.style.overflow = 'hidden'; /* evita rolar por trás */ } function fecharZoomImagem(){ if(!imgZoom) return; imgZoom.style.display = 'none'; if(imgZoomSrc) imgZoomSrc.src = ''; document.body.style.overflow = ''; } /* Fecha clicando fora da imagem */ if(imgZoom){ imgZoom.addEventListener('click', (e)=>{ if(e.target === imgZoom) fecharZoomImagem(); }); } /* Fecha no botão X */ if(imgZoomClose) imgZoomClose.addEventListener('click', fecharZoomImagem); /* Fecha com ESC */ document.addEventListener('keydown', (e)=>{ if(e.key === 'Escape'){ if(imgZoom && imgZoom.style.display === 'flex'){ fecharZoomImagem(); } const cm = document.getElementById('checkoutModal'); if(cm && cm.style.display === 'flex'){ closeCheckout(); } } }); /* Delegação de evento: captura cliques nas imagens dos produtos renderizadas dinamicamente */ document.addEventListener('click', (e)=>{ if(!modoAdmin && e.target && e.target.matches('.produto img')){ abrirZoomImagem(e.target.src); } }); /* 🆕 EDITAR ESTOQUE (ADMIN) */ function editarEstoque(prodId){ const idx = produtos.findIndex(p=>p.id===prodId); if(idx<0) return; const atual = produtos[idx].estoque || 0; const novo = prompt("Digite o novo estoque:", atual); if(novo!==null){ const n = parseInt(novo,10); if(!isNaN(n) && n>=0){ produtos[idx].estoque = n; salvarLocalStorage(); renderProdutos(); } } } /* Boot */ carregarLocalStorage(); renderProdutos(); atualizarBadgeCarrinho();

Comentários

Postagens mais visitadas deste blog

Tentativa

Atualização