All checks were successful
Build and deploy / Validate source (push) Successful in 5s
Build and deploy / Integration suite on a real stack (push) Successful in 2m40s
Build and deploy / Secret scan and release gate (push) Successful in 5s
Build and deploy / Publish images (push) Successful in 53s
- Buttons: add to cart (bag with plus), go to payment (lock), remove from the cart (bin). - Delivery: a pin for pickup in Franca, a truck for home delivery. - Payment: card and QR code on the methods, copy on the PIX code, a clock on its countdown, a check on the confirmation. - Status: a check when the files are sent, check, alert, redo and cross in the quality list instead of Unicode symbols, and a check on finished steps. - Kanban: a truck or pin for where an order goes, a speech bubble on the WhatsApp link, a download arrow on the file buttons. All Lucide shapes drawn inline, as in the header. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
105 lines
5.0 KiB
JavaScript
105 lines
5.0 KiB
JavaScript
/* Site DTF — Choosing a product, and the declared sheet/loose-artwork switch.
|
|
Extracted verbatim from the single inline script in web/index.html.
|
|
Loaded as classic scripts in the order listed there: they share one global
|
|
scope and run top to bottom, exactly as the original did. */
|
|
// ── escolha
|
|
document.querySelectorAll('.ec').forEach(b=>b.addEventListener('click',()=>escolheProduto(b.dataset.modo)));
|
|
// Back on the home and into the same product: the artworks sent are still there.
|
|
function escolheProduto(m){
|
|
if(modo===m && $('foco').classList.contains('on')) vaiPara(PAGINAS[m]);
|
|
else abrir(m);
|
|
}
|
|
function abrir(m){
|
|
modo=m; artes=[]; folhas=[]; metros=0; nota=0; reencaixado=false;
|
|
montagemCm=0;
|
|
avisoTipo('');
|
|
pintaModo();
|
|
$('lista').innerHTML=''; $('rA').style.display='none'; recusa([]);
|
|
recemChegada=null;
|
|
$('vMt').textContent='—'; previaAoVivo(); agendaAvaliacao();
|
|
limpaPaineis(); // o carrinho só some se o pedido estiver vazio
|
|
vaiPara(PAGINAS[m]);
|
|
}
|
|
function pintaModo(){
|
|
const m=modo;
|
|
const c=MODOS[m];
|
|
$('cards').style.display='none'; $('foco').classList.add('on');
|
|
$('fTit').textContent=c.tit; $('fLg').textContent=c.lg;
|
|
$('zTit').textContent=c.zt; $('zSub').textContent=c.zs;
|
|
$('zManual').hidden=!ehFolha(m);
|
|
$('zOutra').textContent = ehFolha(m) ? 'Adicionar outra folha' : 'Adicionar mais artes';
|
|
$('zona').classList.remove('compacta');
|
|
$('inp').multiple=c.multi;
|
|
// The file decides the price: PNG, JPG and PDF are checked here, the others by hand.
|
|
$('inp').accept = ehFolha(m) ? '.png,.jpg,.jpeg,.pdf,.tif,.tiff,.psd,.psb,.ai,.cdr'
|
|
: '.png,.jpg,.jpeg,.webp';
|
|
$('catFoco').className='cat '+(ehFolha(m)?'file':'av');
|
|
$('larguraFolhaPronta').textContent=String(c.larg).replace('.',',');
|
|
$('foco2').classList.remove('sofila'); // a caixa de requisitos vale nos 4 modos
|
|
$('montcabTit').textContent = ehFolha(m) ? 'Sua folha' : 'Montagem ao vivo';
|
|
$('qOk').innerHTML = ehFolha(m) ? icone('adicionar')+'<span>Adicionar ao carrinho</span>' : 'Ver a folha montada';
|
|
pintaTipoEnvio();
|
|
}
|
|
// O par folha montada / artes separadas fica visível e com preço nos dois lados,
|
|
// nos dois modos: nenhuma troca acontece sem o cliente ver o que muda, e sempre
|
|
// dá para voltar atrás sem recomeçar o pedido.
|
|
function pintaTipoEnvio(){
|
|
const el=$('tipoEnvio'); if(!el) return;
|
|
el.hidden=!modo;
|
|
if(el.hidden) return;
|
|
const folha = ehFolha() ? modo : PAR[modo];
|
|
const avulsa = ehFolha() ? PAR[modo] : modo;
|
|
$('tipoFolhaPreco').textContent=rs(pisoEscada(folha))+' a '+rs(TABELA[folha]).slice(3)+' /m';
|
|
$('tipoAvulsaPreco').textContent='+ '+rs(MONTAGEM[avulsa])+' /m';
|
|
$('larguraFolhaPronta').textContent=String(MODOS[folha].larg).replace('.',',');
|
|
const atual = ehFolha() ? 'folha' : 'avulsa';
|
|
el.querySelectorAll('.cam').forEach(b=>{
|
|
b.classList.toggle('on', b.dataset.tipo===atual);
|
|
b.disabled=folhas.length>0 || artes.length>0; // já tem arquivo: a escolha está feita
|
|
});
|
|
}
|
|
function avisoTipo(txt){
|
|
const el=$('avisoTipo'); if(!el) return;
|
|
el.innerHTML=txt; el.style.display = txt? '' : 'none';
|
|
}
|
|
// A imagem foi declarada folha montada mas não tem resolução para isso. Devolve o
|
|
// arquivo com o motivo e o caminho certo — sem trocar preço por conta própria.
|
|
function recusaFolha(x, md){
|
|
const arquivo=x.f, destino = modo==='uvfile' ? 'uv' : 'avulsa';
|
|
folhas=folhas.filter(y=>y!==x);
|
|
pintaFolha();
|
|
avisoTipo('<b>'+escapeHTML(arquivo.name)+' não é uma folha montada.</b> '+
|
|
'Para ocupar os '+n1(larguraFilme())+' cm do filme ela teria só '+md.dpiFolha+
|
|
' DPI, e o mínimo para imprimir é '+DPI_RECUSA+'. '+
|
|
'Se for uma arte para montarmos, use <b>'+MODOS[destino].tit+'</b>, '+
|
|
'a partir de '+rs(pisoEscada(destino))+'/m. '+
|
|
'<button type="button" id="usarAvulsa">Enviar como '+MODOS[destino].tit.toLowerCase()+'</button>');
|
|
const botao=$('usarAvulsa');
|
|
if(botao) botao.addEventListener('click',()=>{
|
|
avisoTipo(''); trocaTipo(PAR[modo]); sel([arquivo]);
|
|
});
|
|
}
|
|
document.querySelectorAll('#tipoEnvio .cam').forEach(b=>b.addEventListener('click',()=>{
|
|
if(b.disabled) return;
|
|
const querFolha=b.dataset.tipo==='folha';
|
|
if(querFolha===ehFolha()) return;
|
|
avisoTipo(''); trocaTipo(PAR[modo]); // escolha explícita do cliente
|
|
}));
|
|
// Troca declarada, nunca silenciosa: o cliente já viu os dois preços no seletor.
|
|
function trocaTipo(destino){
|
|
if(!destino || modo===destino) return;
|
|
folhas=[]; artes=[]; recemChegada=null; metros=0; nota=0; montagemCm=0;
|
|
modo=destino;
|
|
history.replaceState(history.state,'',PAGINAS[modo]); document.title=tituloPagina();
|
|
$('lista').innerHTML=''; $('rA').style.display='none'; recusa([]);
|
|
pintaModo(); limpaPaineis(); agendaAvaliacao(); previaAoVivo();
|
|
}
|
|
$('bVoltar').addEventListener('click',()=>{
|
|
itemAtual=null; modo=null; $('atual').style.display='none'; $('carrLin').innerHTML=''; pintaPedido();
|
|
$('foco').classList.remove('on');
|
|
['qual','prev'].forEach(id=>$(id).classList.remove('on'));
|
|
if(!pedido.length) $('carr').classList.remove('on');
|
|
vaiPara('/#envio');
|
|
});
|
|
|