added animate presence usage in the work experience page for the toggle switch
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
|
import { motion, AnimatePresence } from 'framer-motion';
|
||||||
|
|
||||||
const WORK_EXPERIENCES = [
|
const WORK_EXPERIENCES = [
|
||||||
{
|
{
|
||||||
@@ -138,48 +139,54 @@ export default function WorkExperience() {
|
|||||||
}}>All Jobs</span>
|
}}>All Jobs</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{filteredExperiences.map((experience, index) => (
|
<AnimatePresence mode="popLayout">
|
||||||
<div key={`${experience.company}-${experience.period}`} style={{
|
{filteredExperiences.map((experience, index) => (
|
||||||
marginBottom: "30px",
|
<motion.div
|
||||||
padding: "20px",
|
layout
|
||||||
backgroundColor: "rgba(152, 116, 116, 0.1)",
|
key={`${experience.company}-${experience.period}`}
|
||||||
borderRadius: "10px",
|
initial={{ opacity: 0, x: -20 }}
|
||||||
border: "1px solid rgba(255, 255, 255, 0.2)",
|
animate={{ opacity: 1, x: 0 }}
|
||||||
display: "flex",
|
exit={{ opacity: 0, x: -20 }}
|
||||||
gap: "20px",
|
transition={{ duration: 0.3 }}
|
||||||
alignItems: "flex-start",
|
style={{
|
||||||
animation: "slideInFromLeft 0.6s ease-out forwards",
|
marginBottom: "30px",
|
||||||
// Reset key when filtering to re-trigger animation cleanly, or just use index if that's preferred strictly for list stability (though re-animating feels nicer for a filter change usually, let's keep it simple with unique key first)
|
padding: "20px",
|
||||||
animationDelay: `${index * 0.2}s`, // Faster stagger for filtered list
|
backgroundColor: "rgba(152, 116, 116, 0.1)",
|
||||||
opacity: 0
|
borderRadius: "10px",
|
||||||
}}>
|
border: "1px solid rgba(255, 255, 255, 0.2)",
|
||||||
{experience.image && (
|
display: "flex",
|
||||||
<img
|
gap: "20px",
|
||||||
src={experience.image}
|
alignItems: "flex-start",
|
||||||
alt={experience.company}
|
}}
|
||||||
style={{
|
>
|
||||||
width: "120px",
|
{experience.image && (
|
||||||
height: "120px",
|
<img
|
||||||
objectFit: "cover",
|
src={experience.image}
|
||||||
borderRadius: "8px",
|
alt={experience.company}
|
||||||
flexShrink: 0
|
style={{
|
||||||
}}
|
width: "120px",
|
||||||
/>
|
height: "120px",
|
||||||
)}
|
objectFit: "cover",
|
||||||
<div style={{ flex: 1 }}>
|
borderRadius: "8px",
|
||||||
<h2 style={{ margin: "0 0 5px 0", fontSize: "clamp(16px, 2vw, 24px)" }}>{experience.company}</h2>
|
flexShrink: 0
|
||||||
<p style={{ margin: "0 0 5px 0", fontSize: "clamp(12px, 1.5vw, 18px)", fontStyle: "italic", opacity: 0.9 }}>{experience.position}</p>
|
}}
|
||||||
<p style={{ margin: "0 0 15px 0", fontSize: "clamp(11px, 1.2vw, 16px)", opacity: 0.8 }}>{experience.period}</p>
|
/>
|
||||||
<ul style={{ margin: 0, paddingLeft: "20px" }}>
|
)}
|
||||||
{experience.description.map((item, idx) => (
|
<div style={{ flex: 1 }}>
|
||||||
<li key={idx} style={{ fontSize: "clamp(10px, 1.2vw, 16px)", marginBottom: "8px", opacity: 0.9 }}>
|
<h2 style={{ margin: "0 0 5px 0", fontSize: "clamp(16px, 2vw, 24px)" }}>{experience.company}</h2>
|
||||||
{item}
|
<p style={{ margin: "0 0 5px 0", fontSize: "clamp(12px, 1.5vw, 18px)", fontStyle: "italic", opacity: 0.9 }}>{experience.position}</p>
|
||||||
</li>
|
<p style={{ margin: "0 0 15px 0", fontSize: "clamp(11px, 1.2vw, 16px)", opacity: 0.8 }}>{experience.period}</p>
|
||||||
))}
|
<ul style={{ margin: 0, paddingLeft: "20px" }}>
|
||||||
</ul>
|
{experience.description.map((item, idx) => (
|
||||||
</div>
|
<li key={idx} style={{ fontSize: "clamp(10px, 1.2vw, 16px)", marginBottom: "8px", opacity: 0.9 }}>
|
||||||
</div>
|
{item}
|
||||||
))}
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
))}
|
||||||
|
</AnimatePresence>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user