iris_backend / src /pages /LoginPage.jsx
Saandraahh's picture
Update IRIS full form and fix applicant message notifications
026c476
import React, { useState } from 'react';
import { motion } from 'framer-motion';
export default function LoginPage({ onNavigate }) {
// A RoleCard component that accepts a 'tint' prop for different color schemes
const RoleCard = ({ title, description, buttonText, role, tint }) => {
const handleNavigationClick = () => {
if (typeof onNavigate === 'function') {
onNavigate(role);
} else {
console.error("Error: onNavigate prop is missing or not a function. Navigation is disabled.");
}
};
const tintStyles = {
yellow: {
card: {
backgroundColor: 'rgba(251, 191, 36, 0.1)',
border: '1px solid rgba(251, 191, 36, 0.3)',
},
button: {
backgroundColor: '#FBBF24',
color: '#1a202c',
}
},
red: {
card: {
backgroundColor: 'rgba(239, 68, 68, 0.1)',
border: '1px solid rgba(239, 68, 68, 0.3)',
},
button: {
backgroundColor: '#EF4444',
color: 'white',
}
},
};
const currentStyle = tintStyles[tint] || {};
return (
<div style={{
width: '100%',
maxWidth: '560px',
borderRadius: '1rem',
backdropFilter: 'blur(12px)',
WebkitBackdropFilter: 'blur(12px)',
boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)',
padding: '2.5rem',
textAlign: 'center',
zIndex: 10,
transition: 'transform 0.3s ease, box-shadow 0.3s ease',
...currentStyle.card
}}>
<h2 style={{ fontSize: '1.75rem', fontWeight: 'bold', marginBottom: '0.5rem' }}>{title}</h2>
<p style={{ color: '#d1d5db', marginBottom: '1.5rem' }}>{description}</p>
<motion.button
onClick={handleNavigationClick}
whileHover={{ scale: 1.03 }}
whileTap={{ scale: 0.98 }}
style={{
width: '100%',
fontWeight: 'bold',
padding: '0.75rem 0',
borderRadius: '0.5rem',
border: 'none',
cursor: 'pointer',
...currentStyle.button
}}
>
{buttonText}
</motion.button>
</div>
);
};
// Animation variants for the main container to stagger its children
const containerVariants = {
hidden: { opacity: 1 }, // Parent is visible, children are not
visible: {
opacity: 1,
transition: {
staggerChildren: 0.2, // Time between each child animation
}
}
};
// Animation variant for the title (fades in from the left)
const titleVariant = {
hidden: { opacity: 0, x: -50 },
visible: {
opacity: 1,
x: 0,
transition: {
duration: 0.5,
ease: "easeOut"
}
}
};
// Animation variant for the admin card (fades in from the top)
const adminCardVariant = {
hidden: { opacity: 0, y: -50 },
visible: {
opacity: 1,
y: 0,
transition: {
duration: 0.5,
ease: "easeOut"
}
}
};
// Animation variant for the applicant card (fades in from the bottom)
const applicantCardVariant = {
hidden: { opacity: 0, y: 50 },
visible: {
opacity: 1,
y: 0,
transition: {
duration: 0.5,
ease: "easeOut"
}
}
};
return (
<div style={{
position: 'relative',
minHeight: '100vh',
width: '100%',
display: 'flex',
flexWrap: 'wrap',
overflow: 'hidden',
backgroundColor: '#020617',
color: 'white',
fontFamily: "'Montserrat', sans-serif",
}}>
<style>{`@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&family=Orbitron:wght@700&display=swap');`}</style>
{/* Background shapes updated to red and yellow */}
<>
<div style={{ position: 'absolute', borderRadius: '50%', filter: 'blur(80px)', opacity: 0.3, width: '400px', height: '400px', backgroundColor: '#EF4444', top: '-50px', left: '-100px' }}></div>
<div style={{ position: 'absolute', borderRadius: '50%', filter: 'blur(80px)', opacity: 0.3, width: '400px', height: '400px', backgroundColor: '#FBBF24', bottom: '-80px', right: '-120px' }}></div>
</>
{/* Main animation container */}
<motion.div
style={{
position: 'relative',
minHeight: '100vh',
width: '100%',
display: 'flex',
flexWrap: 'wrap',
}}
variants={containerVariants}
initial="hidden"
animate="visible"
>
<motion.div
variants={titleVariant}
style={{
flex: '1 1 500px',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
padding: '2rem',
textAlign: 'center',
zIndex: 5,
}}>
<h1 style={{ fontFamily: "'Orbitron', sans-serif", fontSize: 'clamp(3rem, 10vw, 5rem)', fontWeight: 'bold', marginBottom: '0.5rem', color: 'white' }}>IRIS</h1>
<p style={{ fontSize: '1.125rem', color: '#a8b2d1' }}>Intelligent Recruitment Insight System</p>
</motion.div>
<div style={{
flex: '1 1 500px',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
padding: '1rem',
gap: '2rem',
}}>
<motion.div variants={adminCardVariant} style={{width: '100%', display: 'flex', justifyContent: 'center'}}>
<RoleCard title="Admin" description="Manage CVs and requirements" buttonText="Continue as admin" role="admin" tint="red" />
</motion.div>
<motion.div variants={applicantCardVariant} style={{width: '100%', display: 'flex', justifyContent: 'center'}}>
<RoleCard title="Applicant" description="Submit your CV" buttonText="Continue as applicant" role="applicant" tint="yellow" />
</motion.div>
</div>
</motion.div>
</div>
);
};