✨ PREMIUM SUITE

🍁 AI-Powered Resume Builder Canada

Complete Resume & Cover Letter Solution for the Canadian Job Market

1. Upload Your Resume

🎯 Premium Career Suite
$4,99 CAD
  • AI Resume Optimization
  • Custom Cover Letter Generation
  • Canadian Format Standards
  • ATS Optimization
  • PDF & Word Downloads
📄
Drop your resume here
or click to browse
Supports: PDF, Word (.docx)

AI Analysis

🔍 Resume Analysis
Upload your resume to get started. Our AI will provide detailed insights for the Canadian job market.
⚡ Smart Improvements
Get specific recommendations for ATS optimization, Canadian formatting, keywords, and more.

Optimized Resume

📄

Your Transformed Resume

The AI-optimized Canadian version will appear here after processing.

1. Cover Letter Details

🎯 Premium Career Suite
$4,99 CAD
  • AI Cover Letter Generation
  • Resume Optimization Included
  • Canadian Business Format
  • Industry-Specific Content
  • Multiple Download Options

AI Analysis

📝 Cover Letter Analysis
Fill out the form to get started. Our AI will analyze your information and create a compelling Canadian cover letter.
🎯 Smart Customization
Get personalized content that matches Canadian business standards and highlights your strengths.

Your Cover Letter

📝

Your Personalized Cover Letter

Your AI-generated Canadian cover letter will appear here after processing.

`;} else { // Cover Letter const { applicantInfo, date, recipientInfo, subject, body, signature } = data; fileName = `${applicantInfo.name.replace(/\s+/g, '_')}_Cover_Letter.doc`;htmlDoc = `Cover Letter
${applicantInfo.name}
${applicantInfo.address}
${applicantInfo.phone}
${applicantInfo.email}
${date}
${recipientInfo.hiringManager}
${recipientInfo.company}
${recipientInfo.address}
${subject}

${body.opening}

${body.middle}

${body.closing}

${signature}

${applicantInfo.name}
`; }const blob = new Blob(['\ufeff', htmlDoc], { type: 'application/msword' }); const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.style.display = 'none'; a.href = url; a.download = fileName; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(url); document.body.removeChild(a); if (type === 'resume') { showResumeStatus('Archivo Word descargado exitosamente!', 'success'); } else { showCoverLetterStatus('Archivo Word descargado exitosamente!', 'success'); }} catch (error) { console.error('Error generando archivo Word:', error); if (type === 'resume') { showResumeStatus('Error al generar el archivo Word. Intenta de nuevo.', 'error'); } else { showCoverLetterStatus('Error al generar el archivo Word. Intenta de nuevo.', 'error'); } } finally { downloadBtn.disabled = false; downloadBtn.textContent = '📝 Download Word'; } }// --- FUNCIONES DE ESTADO Y PROGRESO --- function showResumeStatus(message, type = 'processing') { const el = document.getElementById('resumeStatusMessage'); el.textContent = message; el.className = `status-message status-${type}`; el.style.display = 'block'; if (type === 'success' || type === 'error') { setTimeout(() => { if (el.textContent === message) el.style.display = 'none'; }, 6000); } }function showResumeProgress(percentage) { const bar = document.getElementById('resumeProgressBar'); const fill = document.getElementById('resumeProgressFill'); if (percentage > 0) { bar.style.display = 'block'; fill.style.width = percentage + '%'; } else { bar.style.display = 'none'; } if (percentage >= 100) { setTimeout(() => { bar.style.display = 'none'; }, 2000); } }function showCoverLetterStatus(message, type = 'processing') { const el = document.getElementById('coverLetterStatusMessage'); el.textContent = message; el.className = `status-message status-${type}`; el.style.display = 'block'; if (type === 'success' || type === 'error') { setTimeout(() => { if (el.textContent === message) el.style.display = 'none'; }, 6000); } }function showCoverLetterProgress(percentage) { const bar = document.getElementById('coverLetterProgressBar'); const fill = document.getElementById('coverLetterProgressFill'); if (percentage > 0) { bar.style.display = 'block'; fill.style.width = percentage + '%'; } else { bar.style.display = 'none'; } if (percentage >= 100) { setTimeout(() => { bar.style.display = 'none'; }, 2000); } }