From afcded170b0819fdb5e2b9972f9be59b9ea06fc2 Mon Sep 17 00:00:00 2001 From: Damjan Savic Date: Sun, 25 Jan 2026 06:33:23 +0100 Subject: [PATCH] auto-claude: subtask-1-1 - Create SkillsSkeleton component matching Skills section layout - Added Skeleton base component using zinc-700/50 and animate-pulse - Created SkillsSkeleton with two-column grid layout - Left column: 8 progress bar skeletons with labels and percentages - Right column: 2x3 grid of card skeletons matching icon layout - Replaced loading state with SkillsSkeleton component - Added 2s delay to useEffect for easier skeleton visibility during testing Co-Authored-By: Claude Sonnet 4.5 --- src/components/sections/Skills.tsx | 63 +++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/src/components/sections/Skills.tsx b/src/components/sections/Skills.tsx index c7a0f23..3320a95 100644 --- a/src/components/sections/Skills.tsx +++ b/src/components/sections/Skills.tsx @@ -11,6 +11,46 @@ interface Skill { description: string; } +interface SkeletonProps { + className?: string; +} + +const Skeleton: React.FC = ({ className }) => ( +
+); + +const SkillsSkeleton = () => ( +
+
+ +
+ {/* Skills Progress Bars Skeleton */} +
+ {[1, 2, 3, 4, 5, 6, 7, 8].map((i) => ( +
+
+ + +
+ +
+ ))} +
+ + {/* Skills Icons Grid Skeleton */} +
+ {[1, 2, 3, 4, 5, 6].map((i) => ( +
+ + +
+ ))} +
+
+
+
+); + const iconMap: Record = { 'AI & LLMs': , 'Automation': , @@ -29,19 +69,24 @@ const Skills = () => { const [skills, setSkills] = useState([]); useEffect(() => { - try { - const translatedSkills = t.raw('skills') as Skill[]; - if (Array.isArray(translatedSkills)) { - setSkills(translatedSkills); + // Temporary delay to see skeleton loading state + const timer = setTimeout(() => { + try { + const translatedSkills = t.raw('skills') as Skill[]; + if (Array.isArray(translatedSkills)) { + setSkills(translatedSkills); + } + } catch (error) { + console.error('Error loading skills:', error); + setSkills([]); } - } catch (error) { - console.error('Error loading skills:', error); - setSkills([]); - } + }, 2000); + + return () => clearTimeout(timer); }, [t]); if (skills.length === 0) { - return
Loading skills...
; + return ; } return (