Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c170f75219 | ||
|
|
2abfcbe217 | ||
|
|
1b148fa574 | ||
|
|
87694077d9 |
+1
-4
@@ -81,7 +81,4 @@ supabase/.temp/
|
||||
.history/
|
||||
|
||||
# Source images (originals before optimization)
|
||||
source-images/
|
||||
|
||||
# Auto Claude data directory
|
||||
.auto-claude/
|
||||
source-images/
|
||||
+1459
File diff suppressed because it is too large
Load Diff
@@ -11,46 +11,6 @@ interface Skill {
|
||||
description: string;
|
||||
}
|
||||
|
||||
interface SkeletonProps {
|
||||
className?: string;
|
||||
}
|
||||
|
||||
const Skeleton: React.FC<SkeletonProps> = ({ className }) => (
|
||||
<div className={`animate-pulse bg-zinc-700/50 rounded ${className}`}></div>
|
||||
);
|
||||
|
||||
const SkillsSkeleton = () => (
|
||||
<section id="skills" className="py-24 relative" aria-label="Loading skills" aria-busy="true">
|
||||
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<Skeleton className="h-8 w-48 mb-12" />
|
||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
||||
{/* Skills Progress Bars Skeleton */}
|
||||
<div className="space-y-6">
|
||||
{[1, 2, 3, 4, 5, 6, 7, 8].map((i) => (
|
||||
<div key={i} className="space-y-2">
|
||||
<div className="flex justify-between items-center">
|
||||
<Skeleton className="h-4 w-24" />
|
||||
<Skeleton className="h-4 w-12" />
|
||||
</div>
|
||||
<Skeleton className="h-2 w-full rounded-full" />
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* Skills Icons Grid Skeleton */}
|
||||
<div className="grid grid-cols-2 sm:grid-cols-3 gap-4">
|
||||
{[1, 2, 3, 4, 5, 6].map((i) => (
|
||||
<div key={i} className="p-6 rounded-xl bg-zinc-800/30 backdrop-blur-sm">
|
||||
<Skeleton className="w-8 h-8 mx-auto mb-3" />
|
||||
<Skeleton className="h-4 w-16 mx-auto" />
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
|
||||
const iconMap: Record<string, React.ReactNode> = {
|
||||
'AI & LLMs': <Bot className="w-8 h-8" />,
|
||||
'Automation': <Workflow className="w-8 h-8" />,
|
||||
@@ -69,24 +29,19 @@ const Skills = () => {
|
||||
const [skills, setSkills] = useState<Skill[]>([]);
|
||||
|
||||
useEffect(() => {
|
||||
// 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([]);
|
||||
try {
|
||||
const translatedSkills = t.raw('skills') as Skill[];
|
||||
if (Array.isArray(translatedSkills)) {
|
||||
setSkills(translatedSkills);
|
||||
}
|
||||
}, 2000);
|
||||
|
||||
return () => clearTimeout(timer);
|
||||
} catch (error) {
|
||||
console.error('Error loading skills:', error);
|
||||
setSkills([]);
|
||||
}
|
||||
}, [t]);
|
||||
|
||||
if (skills.length === 0) {
|
||||
return <SkillsSkeleton />;
|
||||
return <div className="py-24 text-center text-zinc-400">Loading skills...</div>;
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user