From a31764811bd22f4763605ad692d9a9c8342fbaf9 Mon Sep 17 00:00:00 2001 From: admtracksteel Date: Sun, 7 Jun 2026 16:40:35 +0000 Subject: [PATCH] Implementa o editor interativo de Canvas para montagem livre de cartazes --- public/app.js | 527 +++++++++++++++++++++++++++++++++++++++++++++- public/index.html | 39 +++- public/style.css | 54 +++++ 3 files changed, 613 insertions(+), 7 deletions(-) diff --git a/public/app.js b/public/app.js index 36fdfe2..6a3384b 100644 --- a/public/app.js +++ b/public/app.js @@ -7185,10 +7185,35 @@ document.addEventListener('DOMContentLoaded', () => { const tamanho = document.getElementById('cartazTamanhoSelect') ? document.getElementById('cartazTamanhoSelect').value : 'A4'; const orientacao = document.getElementById('cartazOrientacaoSelect') ? document.getElementById('cartazOrientacaoSelect').value : 'retrato'; - const imgContainerHtml = cartazPreviewImageContainer.style.display === 'block' + const imgContainerHtml = cartazPreviewImageContainer.style.display === 'block' && !canvasModeActive ? `
` : ''; + let printContent = ''; + if (canvasModeActive) { + // Clone printable area and cleanup handles / active state borders for print output + const tempContainer = document.createElement('div'); + tempContainer.innerHTML = cartazPrintableArea.innerHTML; + tempContainer.querySelectorAll('.canvas-resize-handle').forEach(h => h.remove()); + tempContainer.querySelectorAll('.canvas-item').forEach(item => { + item.classList.remove('active-item'); + item.removeAttribute('contenteditable'); + // We can remove border style only if it was a dashed editing border + if (item.style.border.includes('dashed')) { + item.style.border = 'none'; + } + }); + printContent = tempContainer.innerHTML; + } else { + printContent = ` +

${title}

+ ${imgContainerHtml} +
+ ${cartazPreviewContent.innerHTML} +
+ `; + } + const printWindow = window.open('', '_blank'); printWindow.document.write(` @@ -7225,6 +7250,9 @@ document.addEventListener('DOMContentLoaded', () => { border: ${border === 'none' ? 'none' : `${border} ${text}`}; display: flex; flex-direction: column; + position: relative; + overflow: hidden; + container-type: inline-size; } h1 { text-align: center; @@ -7260,6 +7288,18 @@ document.addEventListener('DOMContentLoaded', () => { li { margin-bottom: 12px; } + + /* Estilos específicos do Canvas no PDF/Print */ + .canvas-item { + position: absolute !important; + box-sizing: border-box; + background: rgba(255, 255, 255, 0.3); + border-radius: 8px; + padding: 10px; + border: none !important; + box-shadow: none !important; + } + @media print { body { background: transparent; padding: 0; display: block; } .cartaz-frame { @@ -7277,11 +7317,7 @@ document.addEventListener('DOMContentLoaded', () => {
-

${title}

- ${imgContainerHtml} -
- ${cartazPreviewContent.innerHTML} -
+ ${printContent}