"From data to classrooms, from analyst to educator β this is the story of a woman who keeps reinventing herself."
Built the foundations of my career bridging the gap between business needs and technology. Developed a systems-thinking mindset and deep stakeholder management skills that would carry me through every role to come.
Led cross-functional technology projects end-to-end. Mastered risk management, planning under uncertainty, and the art of keeping teams aligned and motivated under pressure.
Owned product roadmaps and translated complex user needs into features that shipped. This role gave me a customer-first lens and strategic vision that I carry into every classroom today.
Turned raw data into meaningful insight for decision-makers. Developed strong analytical and visualisation skills that now give me an edge when helping students understand computational thinking.
Made a courageous leap into education. Started as a cover supervisor to learn the classroom from the ground up, earned my teaching qualification, and stepped confidently into Science. The boldest career decision I've ever made.
Teaching and inspiring the next generation of technology talent at an outstanding school. Leveraging every ounce of my industry experience to bring real-world context to the classroom β and working towards Head of Department.
Document your transformation β before, during and after.
Click each bar to update your progress
', stateScript + '\n'); const blob = new Blob([html], {type:'text/html'}); const url = URL.createObjectURL(blob); const a = document.createElement('a'); const now = new Date(); const stamp = now.toISOString().slice(0,10); a.href = url; a.download = `eloho-portfolio-backup-${stamp}.html`; a.click(); URL.revokeObjectURL(url); showToast('β Backup downloaded!', 3000); updateTimestamp(); } function collectState(){ const state = {}; // Hero fields state.heroName = document.getElementById('hero-name')?.innerHTML || ''; state.heroRole = document.getElementById('hero-role')?.innerHTML || ''; state.heroQuote = document.getElementById('hero-quote')?.innerHTML || ''; state.missionTxt = document.getElementById('mission-txt')?.innerHTML || ''; state.chipEmail = document.getElementById('chip-email')?.innerHTML || ''; state.chipLoc = document.getElementById('chip-loc')?.innerHTML || ''; state.chipLinked = document.getElementById('chip-linked')?.innerHTML || ''; state.chipSchool = document.getElementById('chip-school')?.innerHTML || ''; // Avatar const avImg = document.getElementById('av-img'); state.avatarSrc = avImg && avImg.style.display !== 'none' ? avImg.src : ''; // Autobiography state.autoText = document.getElementById('auto-text')?.value || ''; state.rebrandJournal = document.getElementById('rebrand-journal')?.value || ''; // Tags β capture all tag containers const tagContainers = ['values-tags','love-tags','hobby-tags','try-tags','inspo-tags']; state.tags = {}; tagContainers.forEach(id=>{ const el = document.getElementById(id); if(el) state.tags[id] = [...el.querySelectorAll('.tag')].map(t=>t.textContent); }); // Career timeline state.career = []; document.querySelectorAll('#career-timeline .tl-item').forEach(item=>{ state.career.push({ title: item.querySelector('h4')?.innerHTML || '', meta: item.querySelector('.tl-meta span')?.innerHTML || '', badge: item.querySelector('.tl-badge')?.outerHTML || '', desc: item.querySelector('p')?.innerHTML || '', isCurrent: item.classList.contains('tl-current') }); }); // Progress bars state.progress = []; document.querySelectorAll('.prog-row').forEach(row=>{ state.progress.push({ label: row.querySelector('.prog-label')?.textContent || '', pct: parseInt(row.querySelector('.prog-pct')?.textContent) || 0 }); }); // Photos β embed base64 images state.photos = {career:[], life:[], rebrand:[]}; ['career','life','rebrand'].forEach(cat=>{ const grid = document.getElementById('grid-'+cat); if(!grid) return; grid.querySelectorAll('.photo-tile:not(.add-tile)').forEach(tile=>{ const img = tile.querySelector('img'); const cap = tile.querySelector('.photo-overlay')?.textContent || ''; if(img) state.photos[cat].push({src: img.src, caption: cap}); }); }); return state; } // ββ RESTORE BACKUP βββββββββββββββββββββββββββββββββββββββββ function restoreBackup(e){ const file = e.target.files[0]; if(!file){ return; } showToast('Restoring from backupβ¦'); const reader = new FileReader(); reader.onload = ev => { const html = ev.target.result; const match = html.match(/\s*