1const e=`<!doctype html> 2<html lang="pt-BR"> 3<head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width,initial-scale=1"> 6 <title>Calculadora de Lombada â Itacaiúnas Tools</title> 7 <style> 8 .spine-summary{display:grid;grid-template-columns:90px minmax(0,1fr);gap:24px;align-items:center} 9 .preview-wrap{display:grid;justify-items:center;gap:8px} 10 .book-spine{height:94px;width:22px;min-width:14px;max-width:42px;border-radius:7px;background:linear-gradient(90deg,#222 0,#454545 45%,#1a1a1a 100%);box-shadow:0 8px 18px rgba(0,0,0,.18);display:grid;place-items:center;transition:width .2s ease} 11 .book-spine span{writing-mode:vertical-rl;transform:rotate(180deg);font-size:.65rem;letter-spacing:.08em;font-weight:800;color:#fff} 12 .preview-label{font-size:.68rem;font-weight:800;letter-spacing:.12em;color:var(--muted)} 13 .result-kicker{font-size:.73rem;font-weight:900;letter-spacing:.1em;text-transform:uppercase;color:var(--brand)} 14 .result-number{margin-top:8px;font-size:clamp(2.7rem,7vw,4.8rem);font-weight:900;line-height:.9;letter-spacing:-.05em} 15 .result-number small{font-size:1rem;letter-spacing:0;color:var(--muted);font-weight:800} 16 .result-cm{margin:.55rem 0 0;color:var(--muted);font-weight:700} 17 .chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px} 18 .chip{border:1px solid var(--border);background:#f7faf7;border-radius:999px;padding:7px 11px;font-size:.78rem;color:#506158} 19 .paper-grid,.binding-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px} 20 .choice{appearance:none;border:1px solid var(--border);border-radius:12px;background:#fff;padding:13px 10px;min-height:62px;color:var(--text);cursor:pointer;text-align:center;font-weight:800;transition:border-color .15s,background .15s,color .15s,transform .15s} 21 .choice:hover{border-color:#9eb0a4;transform:translateY(-1px)} 22 .choice.active{background:#1d1d1d;color:#fff;border-color:#1d1d1d} 23 .choice span{display:block;margin-top:3px;font-size:.75rem;font-weight:500;color:var(--muted)} 24 .choice.active span{color:#d8d8d8} 25 .section-label{display:block;margin:20px 0 10px;font-size:.76rem;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:#52635a} 26 .pages-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:center} 27 .pages-row span{font-size:.88rem;color:var(--muted)} 28 .status{min-height:1.4em;margin:9px 0 0;font-size:.82rem;color:var(--muted)} 29 .status.error{color:var(--danger)} 30 .calc-actions{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:18px} 31 .calc-actions .btn{width:100%} 32 .technical-note{margin-top:14px;font-size:.84rem;line-height:1.55;color:var(--muted)} 33 #customCaliperWrap{margin-top:12px} 34 @media(max-width:620px){ 35 .spine-summary{grid-template-columns:72px minmax(0,1fr);gap:16px} 36 .paper-grid{grid-template-columns:1fr 1fr} 37 .choice{min-height:58px;padding:11px 8px;font-size:.9rem} 38 .calc-actions{grid-template-columns:1fr} 39 } 40 </style> 41</head> 42<body> 43 <main class="tool-shell"> 44 <header class="tool-head"> 45 <div class="eyebrow">Itacaiúnas Tools · Produção editorial</div> 46 <h1>Calculadora de Lombada</h1> 47 <p class="lead">Estime a largura da lombada a partir do número de páginas, do calibre do papel e do tipo de acabamento. Para fechamento de arquivo, confirme sempre o gabarito final com a gráfica.</p> 48 </header> 49 50 <section class="card"> 51 <div class="spine-summary"> 52 <div class="preview-wrap" aria-hidden="true"> 53 <div class="book-spine" id="spinePreview"><span>LOMBADA</span></div> 54 <div class="preview-label">PREVIEW</div> 55 </div> 56 <div> 57 <div class="result-kicker">Lombada calculada</div> 58 <div class="result-number"><span id="spineMm">4,8</span> <small>mm</small></div> 59 <p class="result-cm" id="spineCm">0,48 cm</p> 60 <div class="chips"> 61 <span class="chip" id="pagesChip">100 págs</span> 62 <span class="chip" id="paperChip">Offset 75g</span>
63 <span class="chip" id="bindingChip">Brochura</span> 64 </div> 65 </div> 66 </div> 67 <p class="technical-note" id="resultNote">Brochura inclui 0,50 mm de margem técnica para cola/acabamento. Confirme a medida final com a gráfica.</p> 68 </section> 69 70 <section class="card" style="margin-top:16px"> 71 <div class="field" style="margin-bottom:0"> 72 <label for="pages">Número de páginas</label> 73 <div class="pages-row"> 74 <input id="pages" type="number" min="4" step="2" value="100" inputmode="numeric"> 75 <span>páginas</span> 76 </div> 77 <small>Use o total final de páginas do PDF. Múltiplos de 4 refletem melhor a imposição real em cadernos.</small> 78 </div> 79 80 <span class="section-label">Tipo de papel (miolo)</span> 81 <div class="paper-grid" id="paperOptions"> 82 <button type="button" class="choice" data-paper="offset90" data-label="Offset 90g" data-caliper="0.102">Offset 90g<span>0,102 mm</span></button> 83 <button type="button" class="choice active" data-paper="offset75" data-label="Offset 75g" data-caliper="0.085">Offset 75g<span>0,085 mm</span></button> 84 <button type="button" class="choice" data-paper="offset90hb" data-label="Offset 90g HB" data-caliper="0.135">Offset 90g HB<span>High Bulk · 0,135 mm</span></button> 85 <button type="button" class="choice" data-paper="offset120" data-label="Offset 120g" data-caliper="0.136">Offset 120g<span>0,136 mm</span></button> 86 <button type="button" class="choice" data-paper="couche115" data-label="Couchê 115g" data-caliper="0.095">Couchê 115g<span>0,095 mm</span></button> 87 <button type="button" class="choice" data-paper="couche150" data-label="Couchê 150g" data-caliper="0.124">Couchê 150g<span>0,124 mm</span></button> 88 <button type="button" class="choice" data-paper="polen80" data-label="Pólen Soft 80g" data-caliper="0.112">Pólen Soft 80g<span>0,112 mm</span></button> 89 <button type="button" class="choice" data-paper="custom" data-label="Personalizado" data-caliper="">Personalizado<span>Informar calibre</span></button> 90 </div> 91 92 <div class="field" id="customCaliperWrap" style="display:none"> 93 <label for="customCaliper">Calibre de uma folha (mm)</label> 94 <input id="customCaliper" type="number" min="0.030" max="0.400" step="0.001" value="0.100" inputmode="decimal"> 95 <small>Informe a espessura real de uma folha fÃsica, preferencialmente fornecida pelo fabricante ou medida com paquÃmetro.</small> 96 </div> 97 98 <span class="section-label">Acabamento</span> 99 <div class="binding-grid" id="bindingOptions"> 100 <button type="button" class="choice active" data-binding="paperback" data-label="Brochura">Brochura<span>+0,50 mm de margem técnica</span></button> 101 <button type="button" class="choice" data-binding="hardcover" data-label="Capa dura">Capa dura<span>espessura do bloco</span></button> 102 </div> 103 104 <p id="validation" class="status" role="status"></p> 105 </section> 106 107 <div class="calc-actions"> 108 <button class="btn secondary" id="copy" type="button">Copiar resultado</button> 109 <button class="btn" id="download" type="button">Baixar TXT</button> 110 </div> 111 112 <div class="notice" style="margin-top:16px"> 113 O cálculo é uma estimativa. Papéis com a mesma gramatura podem ter calibres diferentes entre fabricantes, e cola, prensagem, umidade e processo de encadernação podem alterar a medida final. 114 </div> 115 </main> 116 117 <script> 118 const $ = (id) => document.getElementById(id); 119 const fmt = (value, digits) => value.toLocaleString('pt-BR', { 120 minimumFractionDigits: digits, 121 maximumFractionDigits: digits 122 }); 123 124 let selectedPaper = 'offset75'; 125 let selectedBinding = 'paperback'; 126 let lastResult = null; 127 128 function getSelectedPaperButton() { 129 return document.querySelector('[data-paper="' + selectedPaper + '"]'); 130 } 131 132 function getSelectedBindingButton() { 133 return document.querySelector('[data-binding="' + selectedBinding + '"]'); 134 } 135 136 function getCaliper() { 137 if (selectedPaper === 'custom') return Number($('customCaliper').value); 138 return Number(getSelectedPaperButton()?.dataset.caliper || 0); 139 } 140 141 function setActive(group, attribute, value) { 142 document.querySelectorAll('[' + attribute + ']').forEach((button) => { 143 button.classList.toggle('active', button.dataset[attribute.replace('data-', '')] === value); 144 }); 145 } 146 147 function calculate() { 148 const pages = Number($('pages').value); 149 const caliper = getCaliper(); 150 const paperButton = getSelectedPaperButton(); 151 const bindingButton = getSelectedBindingButton(); 152 const validation = $('validation'); 153 154 validation.textContent = ''; 155 validation.classList.remove('error'); 156 157 if (!Number.isInteger(pages) || pages < 4 || pages % 2 !== 0) { 158 validation.textContent = 'Informe um total par de páginas, com no mÃnimo 4 páginas.'; 159 validation.classList.add('error'); 160 lastResult = null; 161 return; 162 } 163 164 if (!Number.isFinite(caliper) || caliper < 0.03 || caliper > 0.4) { 165 validation.textContent = 'Informe um calibre válido entre 0,030 mm e 0,400 mm.'; 166 validation.classList.add('error'); 167 lastResult = null; 168 return; 169 } 170 171 const sheets = pages / 2; 172 const block = sheets * caliper; 173 const allowance = selectedBinding === 'paperback' ? 0.5 : 0; 174 const spine = block + allowance; 175 const paperLabel = paperButton?.dataset.label || 'Papel'; 176 const bindingLabel = bindingButton?.dataset.label || 'Acabamento'; 177 178 $('spineMm').textContent = fmt(spine, 1); 179 $('spineCm').textContent = fmt(spine / 10, 2) + ' cm'; 180 $('pagesChip').textContent = pages + ' págs'; 181 $('paperChip').textContent = paperLabel; 182 $('bindingChip').textContent = bindingLabel; 183 184 const previewWidth = Math.max(14, Math.min(42, 10 + spine * 3)); 185 $('spinePreview').style.width = previewWidth + 'px'; 186 187 $('resultNote').textContent = selectedBinding === 'paperback' 188 ? 'Brochura inclui 0,50 mm de margem técnica para cola/acabamento. Confirme a medida final com a gráfica.' 189 : 'Para capa dura, este valor representa apenas a espessura estimada do bloco do miolo. A lombada estrutural deve seguir o gabarito da encadernadora.'; 190 191 if (pages % 4 !== 0) { 192 validation.textContent = 'Cálculo realizado. Para produção em cadernos, confirme com a gráfica se o total deverá ser múltiplo de 4.'; 193 } 194 195 lastResult = { 196 pages, 197 sheets, 198 caliper, 199 paperLabel, 200 bindingLabel, 201 block, 202 allowance, 203 spine 204 }; 205 } 206 207 function resultText() { 208 if (!lastResult) calculate(); 209 if (!lastResult) return null; 210 const r = lastResult; 211 return [
212 'Itacaiúnas Tools â Calculadora de Lombada', 213 '', 214 'Páginas: ' + r.pages, 215 'Folhas no bloco: ' + r.sheets, 216 'Papel: ' + r.paperLabel, 217 'Calibre: ' + fmt(r.caliper, 3) + ' mm/folha', 218 'Acabamento: ' + r.bindingLabel, 219 'Espessura do bloco: ' + fmt(r.block, 2) + ' mm', 220 'Margem técnica: ' + fmt(r.allowance, 2) + ' mm', 221 'Lombada estimada: ' + fmt(r.spine, 1) + ' mm (' + fmt(r.spine / 10, 2) + ' cm)', 222 '', 223 'Observação: confirme a medida final com a gráfica/encadernadora antes de fechar a capa.' 224 ].join('\\n'); 225 } 226 227 async function copyResult() { 228 const text = resultText(); 229 if (!text) return; 230 try { 231 await navigator.clipboard.writeText(text); 232 $('validation').textContent = 'Resultado copiado para a área de transferência.'; 233 $('validation').classList.remove('error'); 234 } catch { 235 $('validation').textContent = 'Não foi possÃvel copiar automaticamente.'; 236 $('validation').classList.add('error'); 237 } 238 } 239 240 function downloadResult() { 241 const text = resultText(); 242 if (!text) return; 243 const blob = new Blob([text], { type: 'text/plain;charset=utf-8' }); 244 const href = URL.createObjectURL(blob); 245 const link = document.createElement('a'); 246 link.href = href; 247 link.download = 'calculo-lombada-itacaiunas.txt'; 248 document.body.appendChild(link); 249 link.click(); 250 link.remove(); 251 URL.revokeObjectURL(href); 252 $('validation').textContent = 'Arquivo TXT gerado.'; 253 $('validation').classList.remove('error'); 254 } 255 256 document.querySelectorAll('[data-paper]').forEach((button) => { 257 button.addEventListener('click', () => { 258 selectedPaper = button.dataset.paper; 259 setActive('paper', 'data-paper', selectedPaper); 260 $('customCaliperWrap').style.display = selectedPaper === 'custom' ? 'grid' : 'none'; 261 calculate(); 262 }); 263 }); 264 265 document.querySelectorAll('[data-binding]').forEach((button) => { 266 button.addEventListener('click', () => { 267 selectedBinding = button.dataset.binding; 268 setActive('binding', 'data-binding', selectedBinding); 269 calculate(); 270 }); 271 }); 272 273 $('pages').addEventListener('input', calculate); 274 $('customCaliper').addEventListener('input', calculate); 275 $('copy').addEventListener('click', copyResult); 276 $('download').addEventListener('click', downloadResult); 277 278 calculate(); 279 <\/script> 280</body> 281</html>`;export{e as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.