- {skills.map((skill, index) => (
-
-
-
-
{skill.level}%
+ {timelineData.map((item, index) => {
+ const adjustedSkills = skills.map((s) => {
+ const stepLevel = s.progression?.[index] ?? 0;
+ return {
+ ...s,
+ level: Math.floor((s.level * stepLevel) / 100),
+ };
+ });
+ return (
+
(sectionRefs.current[index] = el)}
+ style={{
+ flex: "0 0 100%",
+ scrollSnapAlign: "center",
+ display: "flex",
+ flexDirection: "column",
+ alignItems: "center",
+ justifyContent: "center",
+ padding: "2rem",
+ boxSizing: "border-box",
+ }}
+ >
+ {item.title}
+ {item.date}
+
+ {item.content}
+
+
+ {/* SKILLS: show per stage */}
+
+
+ {adjustedSkills.filter((s) => s.level > 0).map((skill, sIndex) => (
+
+
+ {skill.name}
+
+
+ {getSkillLabel(skill.level)}
+
+
+ ))}
- {skill.name}
-
- ))}
-
-
+
+ );
+ })}
+
+ {/* End of scroll container */}
+ {timelineFinished && (
+
-
- )}
+ )}
+
)
-}
\ No newline at end of file
+}
+
diff --git a/src/app/globals.css b/src/app/globals.css
index f599512..b8b136e 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -276,3 +276,39 @@ body {
opacity: 0;
}
+@keyframes fadeInSkill {
+ 0% {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.skill-card {
+ opacity: 0;
+ transform: translateY(10px);
+ transition: opacity 0.3s ease-out, transform 0.3s ease-out;
+}
+
+.animate-skill {
+ animation: fadeInSkill 0.6s ease-out forwards;
+}
+
+@keyframes fadeInButton {
+ from {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.learnMoreButton {
+ animation: fadeInButton 0.5s ease-out;
+}
+