Skip to main content

Your Cover Letter

0 words ~1 page

Loading your cover letter...

${coverEl.innerHTML} `; const converted = htmlDocx.asBlob(docHtml); saveAsBlob(converted, filename); }); // Download TXT document.getElementById('download-txt-btn').addEventListener('click', () => { const name = (outputs?.applicantName || 'Applicant').replace(/\s+/g, '_'); const co = (outputs?.targetCompany || 'Company').replace(/\s+/g, '_'); const filename = `${name}_${co}_Cover_Letter.txt`; const textContent = coverEl.innerText.replace(/\n{3,}/g, '\n\n').trim(); const blob = new Blob([textContent], { type: 'text/plain;charset=utf-8' }); saveAsBlob(blob, filename); }); function saveAsBlob(blob, filename) { const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); } function updateWordCount() { const words = (coverEl.innerText || '').trim().split(/\s+/).filter(Boolean).length; const pages = Math.max(1, Math.ceil(words / 350)); document.getElementById('word-count').innerHTML = ` ${words.toLocaleString()} words`; document.getElementById('page-est').innerHTML = ` ~${pages} page${pages !== 1 ? 's' : ''}`; } const _wcObserver = new MutationObserver(updateWordCount); _wcObserver.observe(coverEl, { childList: true, subtree: true, characterData: true }); coverEl.addEventListener('input', updateWordCount); // Unsaved changes warning let _dirty = false; coverEl.addEventListener('input', () => { _dirty = true; }); window.addEventListener('beforeunload', (e) => { if (_dirty) { e.preventDefault(); e.returnValue = ''; } }); // Disconnect observer on page unload to prevent leaks window.addEventListener('pagehide', () => _wcObserver.disconnect()); // Expose functions to global scope for onclick handlers window.applyRefinement = applyRefinement; window.generateCoverOnDemand = generateCoverOnDemand; })();