import React, { JSX } from 'react'; import { useNavigate } from 'react-router-dom'; import { Box, Button, Container, Paper, Typography, Grid, Step, StepLabel, Stepper, Stack, ButtonProps, } from '@mui/material'; import { styled } from '@mui/material/styles'; import PlayArrowIcon from '@mui/icons-material/PlayArrow'; import AssessmentIcon from '@mui/icons-material/Assessment'; import PersonIcon from '@mui/icons-material/Person'; import WorkIcon from '@mui/icons-material/Work'; import AutoAwesomeIcon from '@mui/icons-material/AutoAwesome'; import DescriptionIcon from '@mui/icons-material/Description'; import professionalConversationPng from 'assets/Conversation.png'; import selectAJobPng from 'assets/select-a-job.png'; import selectJobAnalysisPng from 'assets/select-job-analysis.png'; import selectACandidatePng from 'assets/select-a-candidate.png'; import selectStartAnalysisPng from 'assets/select-start-analysis.png'; import waitPng from 'assets/wait.png'; import finalResumePng from 'assets/final-resume.png'; import { Beta } from 'components/ui/Beta'; import { Quote } from '@uiw/react-json-view'; // Styled components matching HomePage patterns const HeroSection = styled(Box)(({ theme }) => ({ padding: theme.spacing(3, 0), backgroundColor: theme.palette.primary.main, color: theme.palette.primary.contrastText, [theme.breakpoints.down('md')]: { padding: theme.spacing(2, 0), }, })); const StepSection = styled(Box)(({ theme }) => ({ padding: theme.spacing(6, 0), '&:nth-of-type(even)': { backgroundColor: theme.palette.background.default, }, })); const StepNumber = styled(Box)(({ theme }) => ({ backgroundColor: theme.palette.action.active, color: theme.palette.background.paper, borderRadius: '50%', width: 60, height: 60, display: 'flex', justifyContent: 'center', alignItems: 'center', fontSize: '1.5rem', fontWeight: 'bold', margin: '0 auto 1rem auto', [theme.breakpoints.up('md')]: { margin: 0, }, })); const ImageContainer = styled(Box)(({ theme }) => ({ textAlign: 'center', '& img': { maxWidth: '100%', height: 'auto', borderRadius: theme.spacing(1), boxShadow: theme.shadows[3], border: `2px solid ${theme.palette.action.active}`, }, })); const steps = [ 'Select Job Analysis', 'Select a Candidate', 'Choose a Job', 'Start Assessment', 'Review Results', 'Generate Resume', ]; interface StepContentProps { stepNumber: number; title: string; subtitle: string; icon: React.ReactNode; description: string[]; imageSrc: string; imageAlt: string; note?: string; success?: string; reversed?: boolean; } const StepContent: React.FC = ({ stepNumber, title, subtitle, icon, description, imageSrc, imageAlt, note, success, reversed = false, }) => { const textContent = ( {stepNumber} {title} {icon} {subtitle} {description.map((paragraph, index) => ( {paragraph} ))} {note && ( Note: {note} )} {success && ( 🎉 {success} )} ); const imageContent = ( {imageAlt} ); return ( {reversed ? ( <> {imageContent} {textContent} ) : ( <> {textContent} {imageContent} )} ); }; interface HeroButtonProps extends ButtonProps { children?: string; path: string; } const HeroButton = (props: HeroButtonProps): JSX.Element => { const { children, onClick, path, ...rest } = props; const navigate = useNavigate(); const handleClick = (): void => { navigate(path); }; const HeroStyledButton = styled(Button)(({ theme }) => ({ marginTop: theme.spacing(2), padding: theme.spacing(1, 3), fontWeight: 500, backgroundColor: theme.palette.action.active, color: theme.palette.background.paper, '&:hover': { backgroundColor: theme.palette.action.active, opacity: 0.9, }, })); return ( {children} ); }; const HowItWorks: React.FC = () => { const navigate = useNavigate(); const handleGetStarted = (): void => { navigate('/job-analysis'); }; return ( {/* Hero Section */} {/* Hero Section */} Your complete professional story, beyond a single page Let potential employers discover the depth of your experience through interactive Q&A and tailored resumes Get Started as Candidate {/* Recruit Talent */} Welcome to the Backstory Beta! Here are your steps from zero-to-hero to see Backstory in action {/* Progress Overview */} {steps.map(label => ( {label} ))} {/* Step 1: Select Job Analysis */} } description={[ "Select 'Job Analysis' from the menu. This takes you to the interactive Job Analysis page, where you will get to evaluate the requirements for a job and perform a Backstory assisted evaluation of a candidate, or yourself!", ]} imageSrc={selectJobAnalysisPng} imageAlt="Select Job Analysis from menu" /> {/* Step 2: Select a Candidate */} } description={[ 'First, select a candidate. If you create an account and are logged in, it will default to selecting you. In addition to myself (James), there are several candidates which AI has generated. Each has a unique skillset and can be used to test out the system.', 'Once you\'ve selected a candidate, click "Next".', ]} imageSrc={selectACandidatePng} imageAlt="Select a candidate from the available profiles" note="If you create an account, you can opt-in to have your account show up for others to view as well, or keep it private for just your own resume generation and job research." reversed={true} /> {/* Step 3: Select a Job */} } description={[ 'After selecting a candidate, explore a little bit and then select one of the jobs. The requirements and information provided on Backstory are extracted from job postings that users have pasted as a job description or uploaded from a PDF.', 'Clicking a job will give you more details about it.', 'When you\'re happy with your selection, click "Next".', ]} imageSrc={selectAJobPng} imageAlt="Select a job from the available options" note="You can create your own job postings once you create an account. Until then, you need to select one that already exists." /> {/* Step 4: Start Assessment */} } description={[ 'After selecting a candidate, you are ready to have Backstory perform the Job Analysis. During this phase, Backstory will take each of requirements extracted from the Job and match it against information about the selected candidate.', 'This could be as little as a simple resume, or as complete as a full work history. Backstory performs similarity searches to identify key elements from the candidate that pertain to a given skill and provides a graded response.', 'To see that in action, click the "Start Skill Assessment" button. Backstory will save the results, only regenerating the information if the candidate updates their uploaded content.', ]} imageSrc={selectStartAnalysisPng} imageAlt="Start the skill assessment process" reversed={true} /> {/* Step 5: Wait and Review */} } description={[ 'Once you begin that action, the Start Skill Assessment button will grey out and the page will begin updating as it collates information about the candidate. As Backstory performs its magic, you can monitor the progress and explore the different identified skills to see how or why a candidate does or does not have that skill.', 'Once it is done, you can see the final Overall Match. This is a weighted score based on amount of evidence a skill had, whether the skill was required or preferred, and other metrics.', 'After looking at the results, you can click "Next" to proceed to the final step--resume generation.', ]} imageSrc={waitPng} imageAlt="Wait for the analysis to complete and review results" /> {/* Step 6: Generate Resume */} } description={[ 'The final step is creating the custom resume for the Candidate tailored to the particular Job. On the bottom right you can click "Next" to have Backstory generate the custom resume.', "Note that the resume focuses on identifying key areas from the Candidate's work history that align with skills which were extracted from the original job posting.", 'After the initial resume is generated, if you are logged in, you can select "Save Resume and Edit" to take you to the resume editor.', ]} imageSrc={finalResumePng} imageAlt="Generated custom resume tailored to the job" success="Success! You can then click the Copy button to copy the resume into your editor, adjust, and apply for your dream job!" reversed={true} /> {/* CTA Section */} Ready to try Backstory? Experience the future of job matching and resume generation today. ); }; export { HowItWorks };