Spaces:
Running
Running
File size: 3,587 Bytes
afd56bc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | import React from 'react';
import { motion } from 'framer-motion';
const steps = [
{ id: 1, label: 'Profil' },
{ id: 2, label: 'Dopasowanie' },
{ id: 3, label: 'Dokumenty' },
{ id: 4, label: 'Generowanie' },
{ id: 5, label: 'Recenzja (Critic)' }
];
interface Props {
activeStep: number;
}
const ProgressStepper: React.FC<Props> = ({ activeStep }) => {
return (
<div className="stepper" style={{ position: 'relative', paddingBottom: '1rem' }}>
<div style={{ position: 'absolute', top: '15px', left: '10%', right: '10%', height: '3px', background: 'rgba(255,255,255,0.05)', zIndex: 0, borderRadius: '4px' }}>
{/* Animowany background progress bar z rozświetleniem */}
<motion.div
initial={{ width: 0 }}
animate={{ width: `${((activeStep - 1) / (steps.length - 1)) * 100}%` }}
transition={{ duration: 0.6, ease: 'easeOut' }}
style={{
height: '100%',
background: 'linear-gradient(90deg, var(--accent-blue), #60A5FA)',
borderRadius: '4px',
boxShadow: '0 0 10px rgba(59, 130, 246, 0.4)'
}}
/>
</div>
{steps.map((step, index) => {
const isCompleted = activeStep > step.id;
const isActive = activeStep === step.id;
return (
<motion.div
key={step.id}
className={`step ${isActive ? 'active' : ''} ${isCompleted ? 'completed' : ''}`}
initial={{ opacity: 0, y: -10 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: index * 0.1 }}
style={{ zIndex: 1, position: 'relative' }}
>
<motion.div
className="step-circle"
animate={isActive ? {
scale: [1, 1.1, 1],
boxShadow: ["0 0 0px rgba(59,130,246,0)", "0 0 20px rgba(59,130,246,0.6)", "0 0 0px rgba(59,130,246,0)"],
borderColor: 'var(--accent-blue)',
background: 'rgba(59,130,246,0.15)'
} : {
scale: 1,
boxShadow: isCompleted ? "0 0 10px rgba(16,185,129,0.3)" : "none",
background: isCompleted ? 'var(--accent-green)' : 'var(--bg-card)',
borderColor: isCompleted ? 'var(--accent-green)' : 'var(--border-subtle)'
}}
transition={{ duration: isActive ? 2 : 0.3, repeat: isActive ? Infinity : 0 }}
style={{
width: '32px', height: '32px', display: 'flex', alignItems: 'center', justifyContent: 'center',
borderRadius: '50%', fontWeight: 800, fontSize: '0.9rem', marginBottom: '0.6rem',
color: isActive ? 'var(--accent-blue)' : (isCompleted ? '#000' : 'var(--text-muted)')
}}
>
{isCompleted ? '✓' : step.id}
</motion.div>
<motion.span
className="step-label"
animate={{ color: isActive ? '#fff' : (isCompleted ? 'var(--accent-green)' : 'var(--text-muted)') }}
style={{
fontWeight: isActive ? 800 : (isCompleted ? 600 : 500),
textShadow: isActive ? '0 0 8px rgba(255,255,255,0.4)' : 'none',
fontSize: '0.85rem'
}}
>
{step.label}
</motion.span>
</motion.div>
);
})}
</div>
);
};
export default ProgressStepper;
|