Zpět Životopis pro sportovce
Krok 1 ze 11 0%
1Email
2Design
3Pozice
4Info
5Vzdělání
6Sport
7Praxe
8Dovednosti
9Certifikace
10Zájmy
11Profil

Kam ti pošleme životopis?

Hotový PDF životopis ti přijde přímo na email. Zdarma.

Vyber design životopisu

Barva záhlaví. Vpravo vidíš náhled v reálném čase.

Nahrát

JPG nebo PNG. Profesionální foto zvyšuje důvěryhodnost.

Co hledáš?

Výběr oboru přizpůsobí doporučené formulace a dovednosti přesně pro tvoji situaci.

Vyber obor pro který sestavuješ CV. Přizpůsobíme dovednosti a formulace.

Základní informace

Kontaktní údaje a jazyky pro životopis.

A1–A2Začátečník B1–B2Středně pokročilý C1Pokročilý C2Plynulý RRodilý mluvčí

Klikni na jazyk výše a přiřaď mu úroveň.

Vzdělání

Celý a přesný název školy zvyšuje důvěryhodnost životopisu.

Tvůj sport

Tohle je tvůj největší majetek. Napíšeme ho tak, aby tomu firmy rozuměly.

Pracovní zkušenosti

Nemusíš mít praxi — sport se počítá. Ale pokud jsi někde brigádoval, napiš to.

Dovednosti

Sem patří jen konkrétní nástroje a systémy — ne týmový hráč nebo komunikativnost.

Soft skills sem nepatří — to jsi ukázal/a konkrétními příklady v sekci Sport. Psát „komunikativní" nebo „týmový hráč" bez důkazu nemá žádnou váhu. Pokud si myslíš, že jsi to v sekci Sport nerozepsal/a dost dobře, doporučuji se vrátit a doplnit to tam — to je místo, kde to skutečně rozhoduje.

Certifikace

Přidej každý certifikát jako samostatný řádek.

Zájmy

2–3 věci stačí. Sport tam nemusíš psát znovu.

Bio

Tohle je profil, který tě definuje — čtou ho všichni.
Zaměř se na to, kdo jsi jako člověk a čeho jsi dosáhl/a — ve sportu, ve škole nebo v osobním životě.
Napiš: „Za svůj největší úspěch považuji X — toho jsem dosáhnul/a a toto z toho dnes využívám."
Tenhle text musíš umět obhájit na pohovoru.
Vzor — přepiš ho svými úspěchy

„Jsem komunikativní, cílevědomý a zodpovědný člověk s aktivním přístupem ke svěřené práci. Mám organizační schopnosti a zkušenosti s vedením týmu — mj. jako kapitán sportovního mužstva. Za svůj největší pracovní úspěch považuji ocenění za inovaci v malé firmě XY. Za osobní úspěch považuji úspěšné ukončení studia na dvou školách souběžně. Jsem hrdý/á na to, že jsem jako kapitán dovedl/a tým k titulu v lize juniorů. Aktivně komunikuji ve třech jazycích."

Pokud nevíš jak začít — zkopíruj vzor, vlož ho do ChatGPT a přidej prompt: „Přepiš tento text tak, aby odpovídal mým zkušenostem — [vlož sem svoje CV]."

Náhled v reálném čase
Ilustrační náhled
?
Kontakt
Dovednosti
Jazyky
Zájmy
Tvoje jméno
Sportovní zkušenosti
— vyplní se —
Vzdělání
— vyplní se —
Vyplněnost: 0%
`; } function buildPDF() { return new Promise(resolve => { if (typeof html2pdf === 'undefined') { resolve(); return; } const fn = v('firstName'), ln = v('lastName'), fullName = (fn + ' ' + ln).trim() || 'Sportovec'; const html = buildCVHtml(); const el = document.getElementById('cvPdfTemplate'); el.innerHTML = html; el.style.display = 'block'; const filename = 'zivotopis-' + fullName.toLowerCase().replace(/[^a-z0-9]+/g, '-') + '.pdf'; const opt = { margin: [0,0,0,0], filename, image: { type: 'jpeg', quality: 0.98 }, html2canvas: { scale: 2, useCORS: true, logging: false }, jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' }, pagebreak: { mode: 'avoid-all' } }; html2pdf().set(opt).from(el).toPdf().get('pdf').then(pdf => { pdfBlob = pdf.output('blob'); window._cvBase64 = pdf.output('datauristring').split(',')[1]; el.style.display = 'none'; pdf.save(filename); resolve(); }).catch(() => { el.style.display = 'none'; resolve(); }); }); } async function sendByEmail() { if (!userEmail || !window._cvBase64) return; const fn = v('firstName'), ln = v('lastName'); const fullName = (fn + ' ' + ln).trim(); // Aktualizuj lead v databázi s jménem + věkem try { await fetch(GAS_URL, { method: 'POST', mode: 'no-cors', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'saveEmail', email: userEmail, typ: 'cv_builder', zdroj: 'cv-builder', jmeno: fn, prijmeni: ln, rok_narozeni: v('birthYear'), timestamp: new Date().toISOString() }) }); } catch(e) {} // Pošli PDF emailem try { await fetch(GAS_URL, { method: 'POST', mode: 'no-cors', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'sendCV', email: userEmail, name: fullName || 'Sportovče', sport: sports.filter(s=>s.name.trim()).map(s=>s.name).join(', '), pdfBase64: window._cvBase64, timestamp: new Date().toISOString() }) }); } catch(err) { /* silent */ } } // ===== SKILLS ROW INPUT ===== function addSkillRow() { skillsList.push(''); renderSkillRows(); setTimeout(() => { const inputs = document.querySelectorAll('.skill-row-inp'); if (inputs.length) inputs[inputs.length - 1].focus(); }, 30); } function updateSkillRow(idx, val) { skillsList[idx] = val; updatePreview(); } function removeSkill(idx) { if (skillsList.length === 1) { skillsList[0] = ''; renderSkillRows(); updatePreview(); return; } skillsList.splice(idx, 1); renderSkillRows(); updatePreview(); } function renderSkillRows() { const container = document.getElementById('skillsRowList'); if (!container) return; container.innerHTML = skillsList.map((s, i) => `
${i + 1}.
`).join(''); } // ===== CERTS ROW INPUT ===== function addCertRow() { certsList.push(''); renderCertRows(); setTimeout(() => { const inputs = document.querySelectorAll('.cert-row-inp'); if (inputs.length) inputs[inputs.length - 1].focus(); }, 30); } function updateCertRow(idx, val) { certsList[idx] = val; updatePreview(); } function removeCert(idx) { if (certsList.length === 1) { certsList[0] = ''; renderCertRows(); updatePreview(); return; } certsList.splice(idx, 1); renderCertRows(); updatePreview(); } function renderCertRows() { const container = document.getElementById('certsRowList'); if (!container) return; container.innerHTML = certsList.map((s, i) => `
${i + 1}.
`).join(''); } // ===== ABOUT ME GENERATOR ===== const TEAM_SPORTS_KW = ['fotbal','hokej','florbal','basketbal','volejbal','rugby','házená','futsal','baseball','softbal','polo','kriket','lakros','ragby','veslování','wate']; function generateAboutMe() { const fn = v('firstName'), ln = v('lastName'); const filledSports = sports.filter(s => s.name.trim()); const hasExp = document.getElementById('exp-yes') && document.getElementById('exp-yes').checked; const filledExps = workExps.filter(w => w.company.trim() || w.role.trim()); const langs = [...selectedLangs.keys()]; const jobTitle = v('jobTitle'); const isTeam = filledSports.some(s => TEAM_SPORTS_KW.some(kw => s.name.toLowerCase().includes(kw))); const sportNames = filledSports.map(s => s.name).join(', '); let parts = []; // Sport intro + soft skill from context if (filledSports.length > 0) { if (isTeam) { parts.push(`Aktivní sportovec${sportNames ? ' ('+sportNames+')' : ''}. Kolektivní sport mě naučil spolupracovat v týmu, komunikovat pod tlakem a nést zodpovědnost za společný výsledek.`); } else { parts.push(`Aktivní sportovec${sportNames ? ' ('+sportNames+')' : ''}. Individuální sport mě naučil disciplíně, sebeřízení a schopnosti pracovat na dlouhodobých cílech.`); } } else { parts.push('Zodpovědný a cílevědomý člověk s aktivním přístupem k práci.'); } // Top sport achievement const topAch = filledSports.find(s => s.achievements.trim()); if (topAch) { const firstLine = topAch.achievements.split('\n')[0].trim(); if (firstLine.length > 5) parts.push(`Mezi mé největší úspěchy patří: ${firstLine.replace(/^[•\-–]+\s*/, '')}.`); } // Work experience if (hasExp && filledExps.length > 0) { const exp = filledExps[0]; const title = [exp.role, exp.company].filter(Boolean).join(' v '); if (title) parts.push(`Mám praktické pracovní zkušenosti — ${title}.`); } // Languages if (langs.length >= 2) { parts.push(`Komunikuji v ${langs.join(' a ')}.`); } else if (langs.length === 1) { parts.push(`Komunikuji česky a ${langs[0].toLowerCase()}.`); } return parts.join(' '); } function autoGenerateAboutMe() { const ta = document.getElementById('aboutMeText'); if (ta) { ta.value = generateAboutMe(); updatePreview(); } } // ===== PHOTO ===== function handlePhotoUpload(event) { const file = event.target.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = (e) => { photoDataUrl = e.target.result; photoHidden = false; const thumb = document.getElementById('photoThumb'); const label = document.getElementById('photoThumbLabel'); if (thumb) { thumb.style.backgroundImage = `url(${photoDataUrl})`; thumb.style.backgroundSize = 'cover'; thumb.style.backgroundPosition = 'center top'; } if (label) label.style.display = 'none'; updatePreview(); }; reader.readAsDataURL(file); } function clearPhoto() { photoDataUrl = null; photoHidden = true; const thumb = document.getElementById('photoThumb'); const label = document.getElementById('photoThumbLabel'); if (thumb) { thumb.style.backgroundImage = ''; } if (label) { label.style.display = ''; label.textContent = 'Bez fotky'; } const input = document.getElementById('photoInput'); if (input) input.value = ''; updatePreview(); } // ===== FINAL PREVIEW ===== function showFinalPreview() { updatePreview(); const modal = document.getElementById('finalPreviewModal'); const content = document.getElementById('finalPreviewContent'); // Show loading state content.style.cssText = `background:#0E1B2E;border-radius:4px;overflow:hidden;min-height:220px;display:flex;align-items:center;justify-content:center;`; content.innerHTML = `
Generuji finální CV…
Chvilku strpení
`; modal.style.display = 'block'; document.body.style.overflow = 'hidden'; // After 2s render real A4 iframe setTimeout(() => { const A4_W = 794; const A4_H = 1123; const modalW = Math.min(window.innerWidth - 32, 800); const scale = modalW / A4_W; const scaledH = Math.round(A4_H * scale); const iframe = document.createElement('iframe'); iframe.style.cssText = `width:${A4_W}px;height:${A4_H}px;border:none;display:block;transform:scale(${scale});transform-origin:top left;`; iframe.srcdoc = buildCVHtml(); content.style.cssText = `background:white;box-shadow:0 8px 40px rgba(0,0,0,0.5);border-radius:4px;overflow:hidden;height:${scaledH}px;`; content.innerHTML = ''; content.appendChild(iframe); }, 2000); } function closeFinalPreview() { document.getElementById('finalPreviewModal').style.display = 'none'; document.body.style.overflow = ''; } async function downloadFromPreview() { const btn = document.getElementById('btnDownloadFinal'); btn.disabled = true; btn.textContent = 'Generuji PDF...'; if (typeof gtag !== 'undefined') gtag('event', 'cv_generated', { event_category: 'conversion', value: 1 }); await buildPDF(); await sendByEmail(); btn.disabled = false; btn.innerHTML = 'Stáhnout PDF →'; closeFinalPreview(); document.getElementById('successOverlay').classList.add('show'); } function downloadPDFAgain() { if (!pdfBlob) return; const name = (v('firstName') + ' ' + v('lastName')).trim().toLowerCase().replace(/[^a-z0-9]+/g, '-') || 'sportovec'; const url = URL.createObjectURL(pdfBlob); const a = document.createElement('a'); a.href = url; a.download = 'zivotopis-' + name + '.pdf'; a.click(); URL.revokeObjectURL(url); } function resetBuilder() { document.getElementById('successOverlay').classList.remove('show'); setStep(0); ['firstName','lastName','jobTitle','phone','city','birthYear', 'schoolName','schoolField','schoolGradYear','hobbies','aboutMeText'].forEach(id => { const el = document.getElementById(id); if (el) el.value = ''; }); skillsList = ['']; renderSkillRows(); certsList = ['']; renderCertRows(); selectedLangs.clear(); renderLangSelected(); updateLangChips(); photoDataUrl = null; photoHidden = false; const thumb = document.getElementById('photoThumb'); const label = document.getElementById('photoThumbLabel'); if (thumb) thumb.style.backgroundImage = ''; if (label) { label.style.display = ''; label.textContent = 'Nahrát'; } const photoIn = document.getElementById('photoInput'); if (photoIn) photoIn.value = ''; schools = [{ name:'', field:'', fromMM:'', fromYY:'', toMM:'', toYY:'', dosud:false, degree:'' }]; sports = [{ name:'', clubs:'', fromMM:'', fromYY:'', toMM:'', toYY:'', dosud:false, role:'', level:'', levelCustom:'', achievements:'' }]; workExps = [{ company:'', role:'', fromMM:'', fromYY:'', toMM:'', toYY:'', dosud:false, desc:'' }]; renderSchools(); renderSports(); renderWorkExps(); updatePreview(); } updatePreview();