Skip to content

Commit 08eeff5

Browse files
committed
Add progress bar to skill container
Introduces a visual progress bar to the skill container component to display XP progress toward the next level. Updates the logic for calculating current level and XP progress, and enhances the UI with new CSS styles for the progress bar and fill.
1 parent fd36ce9 commit 08eeff5

2 files changed

Lines changed: 48 additions & 10 deletions

File tree

src/Components/Skills/SkillContainer/SkillContainer.css

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,28 @@
5454

5555
.skill-container__stats-line {
5656
margin: 0.2rem 0;
57+
display: flex;
58+
flex-direction: column;
59+
gap: 6px;
60+
}
61+
62+
.skill-container__progress-bar {
63+
width: 100%;
64+
height: 12px;
65+
background-color: #3a3a3a;
66+
border-radius: 6px;
67+
overflow: hidden;
68+
border: 2px solid #8b4513;
69+
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.3);
70+
}
71+
72+
.skill-container__progress-fill {
73+
height: 100%;
74+
background: linear-gradient(90deg, #4caf50, #81c784);
75+
border-radius: 4px;
76+
transition: width 0.3s ease;
77+
min-width: 2px;
78+
box-shadow: 0 0 8px rgba(76, 175, 80, 0.5);
5779
}
5880

5981
.skill-container__icon {

src/Components/Skills/SkillContainer/SkillContainer.tsx

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,22 @@ const Skills = ({
1616
xp,
1717
levelInfo
1818
}: SkillProps) => {
19-
const currentLevel = (xp > levelInfo.val) ? levelInfo.id : levelInfo.id - 1;
20-
const xpToNextLevel = (xp > 15000) ? 0 : (levelInfo.val - xp);
21-
const xpToMax = (xp > 15000) ? "Maxed" : 15000 - xp;
19+
const currentLevel = (xp >= levelInfo.val) ? levelInfo.id : levelInfo.id - 1;
20+
const xpToNextLevel = (xp >= 15000) ? 0 : (levelInfo.val - xp);
21+
const xpToMax = (xp >= 15000) ? "Maxed" : 15000 - xp;
22+
23+
// Calculate progress within current level
24+
const currentLevelXpRequirement = levelInfo.id > 1 ? Math.floor(levelInfo.val * 0.85) : 0;
25+
const nextLevelXpRequirement = levelInfo.val;
26+
const xpInCurrentLevel = Math.max(0, xp - currentLevelXpRequirement);
27+
const xpNeededForLevel = nextLevelXpRequirement - currentLevelXpRequirement;
28+
29+
let progressPercentage = 0;
30+
if (xp >= 15000) {
31+
progressPercentage = 100; // Max level
32+
} else if (xpNeededForLevel > 0) {
33+
progressPercentage = Math.min(100, (xpInCurrentLevel / xpNeededForLevel) * 100);
34+
}
2235

2336
return (
2437
<div className="skill-container">
@@ -27,13 +40,16 @@ const Skills = ({
2740
</p>
2841
<div className="skill-container__stats">
2942
<div className="skill-container__stats-line">
30-
Current XP: {xp}
31-
</div>
32-
<div className="skill-container__stats-line">
33-
Level Up in: {xpToNextLevel}
34-
</div>
35-
<div className="skill-container__stats-line">
36-
Max level in: {xpToMax}
43+
<div className="skill-container__progress-bar">
44+
<div
45+
className="skill-container__progress-fill"
46+
style={{
47+
width: `${progressPercentage}%`
48+
}}
49+
></div>
50+
</div>
51+
{xpToNextLevel > 0 ? `XP to next level: ${xpToNextLevel}` : "Max Level Reached"}
52+
{/* {xp} / {levelInfo.val} */}
3753
</div>
3854
</div>
3955
<img

0 commit comments

Comments
 (0)