1. Upload Your CV
Premium AI Transformation
€4,99
Professional Europass CV with AI optimization
📄
Drop your CV here
or click to browse
Supports: PDF, Word (.docx)
AI Analysis
🔍 Europass Analysis
Upload your CV to get started. Our AI will analyze and optimize it according to Europass standards and European job market requirements.
⚡ Smart Improvements
Get specific recommendations for Europass formatting, European keywords, skills presentation, and country-specific optimization.
🌍 Multi-language Support
Our AI can optimize your CV in multiple European languages and adapt it to specific country requirements.
Europass CV Preview
🇪🇺
Your Europass CV
The AI-optimized Europass CV will appear here after processing.
Fully compliant with European standards
`;const blob = new Blob(['\ufeff', htmlDoc], {
type: 'application/msword'
});
const fileName = `${personalInfo.firstName}_${personalInfo.lastName}_Europass_CV.doc`;
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);
showStatus(texts.statusWordGenerated, 'success');} catch (error) {
console.error('Error generating Word file:', error);
showStatus(texts.statusWordError, 'error');
} finally {
if (downloadWordBtn) { // Added null check
downloadWordBtn.disabled = false;
downloadWordBtn.textContent = texts.downloadWord;
}
}
}function showStatus(message, type = 'processing') {
const el = document.getElementById('statusMessage');
if (el) { // Added null check
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 showProgress(percentage) {
const bar = document.getElementById('progressBar');
const fill = document.getElementById('progressFill');
if (bar && fill) { // Added null check
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);
}
}
}