PageSourceSearch

https://editoraitacaiunas.com/assets/caculadora-lombada-BpjIwkJo.js

js editoraitacaiunas.com collected 2026-10-09 22:51:32 UTC 13,615 bytes, 281 lines download raw bytes

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.