// Fix sheet, Export, History, Profile screens function FixSheet({ platform, issue, onClose, onApply, onApplyAll, undone }) { if (!issue) return null; const fix = FIXES[issue.id]; const meta = ISSUE_META[issue.type]; return (
{/* scrim */}
{/* sheet */}
{meta.icon}
{meta.label}
{issue.type === 'missing' ? 'Add a section' : 'Let\'s tighten this'}
{issue.type === 'missing' ? (
Your resume is missing a Skills section. Recruiters scan here first.
{['Figma', 'Prototyping', 'Design Systems', 'User Research', 'Accessibility'].map(s => {s} )}
) : fix ? (
{/* before */}
before
{fix.from}
{/* arrow */}
{/* after */}
after ✨
{fix.to}
{/* reason */}
{fix.reason}
) : null}
skip onApply(issue.id)}> apply fix
); } function UndoToast({ show, kind = 'success', count, message, retry, onUndo, onRetry, onDismiss }) { React.useEffect(() => { if (show) { const t = setTimeout(onDismiss, kind === 'error' ? 6000 : 5000); return () => clearTimeout(t); } }, [show, kind]); if (!show) return null; const leading = kind === 'error' ? : kind === 'chatEdit' ? : ; const label = kind === 'error' ? (message || 'something went wrong') : kind === 'chatEdit' ? 'applied your edit' : `fixed ${count} issue${count === 1 ? '' : 's'}`; const trailing = kind === 'error' && !retry ? : ; return (
{leading} {label} {trailing}
); } function ExportScreen({ platform, onBack }) { const [format, setFormat] = React.useState('pdf'); const [template, setTemplate] = React.useState('classic'); const pdfTemplates = [ { id: 'classic', name: 'Classic', sub: 'Serif, single column', accent: '#1a0d2e' }, { id: 'minimal', name: 'Minimal', sub: 'Clean, lots of whitespace', accent: '#6b5e88' }, { id: 'modern', name: 'Modern', sub: 'Sidebar, sans-serif', accent: '#8a5cf6' }, { id: 'creative', name: 'Creative', sub: 'Color accents, bold display', accent: '#ff4db8' }, ]; const docxTemplates = [ { id: 'ats', name: 'ATS-friendly', sub: 'Keywords optimized, plain', accent: '#5ac77f' }, { id: 'std', name: 'Standard', sub: 'Traditional Word template', accent: '#4dd6ff' }, ]; const templates = format === 'pdf' ? pdfTemplates : docxTemplates; React.useEffect(() => { setTemplate(templates[0].id); }, [format]); const renderPreview = (t) => { const active = t.id === template; return (
setTemplate(t.id)} style={{ background: '#fffdf7', borderRadius: 16, overflow: 'hidden', border: active ? `2.5px solid ${t.accent}` : '1px solid rgba(26,13,46,0.08)', cursor: 'pointer', position: 'relative', boxShadow: active ? `0 8px 24px ${t.accent}33` : '0 1px 4px rgba(0,0,0,0.04)', transition: 'all 0.2s', }}> {/* mini resume preview */}
{t.id === 'classic' && <>
Jordan Rivera
{[95, 75, 88, 60].map((w,i) =>
)}
{[80, 90, 70].map((w,i) =>
)} } {t.id === 'minimal' && <>
JORDAN RIVERA
Senior Product Designer
{[100, 80, 90, 65, 85].map((w,i) =>
)} } {t.id === 'modern' &&
{[70, 90, 50].map((w,i) =>
)}
Jordan Rivera
Sr. Product Designer
{[90, 70, 85, 60].map((w,i) =>
)}
} {t.id === 'creative' && <>
Jordan Rivera
{['#ff4db8','#8a5cf6','#4dd6ff'].map(c =>
)}
{[80, 95, 60, 85].map((w,i) =>
)} } {t.id === 'ats' && <>
JORDAN RIVERA
jordan.r@mail.com | 415-555-0142
EXPERIENCE
{[95, 80, 90, 65].map((w,i) =>
)} } {t.id === 'std' && <>
Jordan Rivera
jordan.r@mail.com • (415) 555-0142
{[90, 75, 85, 60, 80].map((w,i) =>
)} } {active && (
)}
{t.name}
{t.sub}
); }; return (
ship it beautifully
{/* format toggle */}
{['pdf','docx'].map(f => ( ))}
{templates.map(renderPreview)}
ATS pass — your content will parse clean in applicant tracking systems.
download {format}
); } function HistoryScreen({ platform, onBack, onOpen, onExport }) { const history = [ { name: 'Jordan_Resume_v4', score: 82, date: 'just now', delta: +14, current: true }, { name: 'Jordan_Resume_v3', score: 68, date: '2d ago', delta: +6 }, { name: 'Jordan_Resume_v2', score: 62, date: '1w ago', delta: +17 }, { name: 'Jordan_Resume_v1', score: 45, date: '3w ago', delta: null }, ]; return (
{/* progress chart */}
aura growth
+37
↑ since first scan
{/* sparkline */} {[[10,45],[80,38],[160,28],[230,20],[290,8]].map(([x,y],i) => )}
v1v2v3v4
all scans
{history.map((h, i) => (
{/* mini score */}
= 75 ? 'linear-gradient(135deg, #b7f0cd, #5ac77f)' : h.score >= 55 ? 'linear-gradient(135deg, #fae14b, #e5c71a)' : 'linear-gradient(135deg, #ff8a7a, #ff4db8)', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0, fontFamily: 'Instrument Serif, serif', fontSize: 22, color: '#1a0d2e', cursor: h.current ? 'pointer' : 'default' }}> {h.score}
{h.name}
{h.current && current}
{h.date} {h.delta !== null && <> · 0 ? '#5ac77f' : '#ff8a7a', fontWeight: 600 }}>{h.delta > 0 ? '↑' : '↓'} {Math.abs(h.delta)} }
))}
); } function ProfileScreen({ platform, onBack, onExport }) { const stats = [ { label: 'scans', val: 4 }, { label: 'best aura', val: 82 }, { label: 'fixes', val: 27 }, ]; return (
{/* header card */}
Jordan R.
aura apprentice · since Apr 2026
{stats.map(s => (
{s.val}
{s.label}
))}
{/* aura subscription */}
GO PRO
unlimited aura
rescan daily, unlock every template, keep every version in history.
upgrade
{/* settings list */}
{[ { label: 'help & feedback', icon: '?', trailing: 'external' }, { label: 'settings', icon: '⚙', trailing: 'chevron' }, ].map((r, i, arr) => (
{r.icon}
{r.label}
{r.trailing === 'external' ? ( ) : ( )}
))}
); } Object.assign(window, { FixSheet, UndoToast, ExportScreen, HistoryScreen, ProfileScreen });