|
1 | 1 | import React from 'react'; |
2 | 2 | import { motion } from 'motion/react'; |
| 3 | +import { useLang } from "../context/LanguageContext"; |
3 | 4 | import { |
4 | | - Code2, |
5 | | - Cpu, |
6 | 5 | Globe, |
7 | 6 | Layers, |
8 | | - Layout, |
9 | | - MessageSquare, |
10 | | - Smartphone, |
11 | 7 | Zap, |
12 | 8 | Terminal, |
13 | 9 | Database, |
14 | | - Palette |
| 10 | + Cloud, |
| 11 | + ShieldCheck, |
| 12 | + Activity, |
| 13 | + Anchor, |
| 14 | + GitBranch, |
| 15 | + Settings |
15 | 16 | } from 'lucide-react'; |
16 | 17 |
|
17 | 18 | const SkillCard = ({ |
@@ -52,118 +53,168 @@ const SkillCard = ({ |
52 | 53 | ); |
53 | 54 |
|
54 | 55 | export default function SkillsBento() { |
| 56 | + const { t } = useLang(); |
| 57 | + |
55 | 58 | return ( |
56 | | - <section className="py-24 px-6 max-w-7xl mx-auto"> |
57 | | - <div className="mb-12"> |
58 | | - <h2 className="text-3xl md:text-4xl font-bold text-white mb-4 uppercase tracking-tighter"> |
59 | | - Technical <span className="text-amber-500">Arsenal</span> |
60 | | - </h2> |
61 | | - <p className="text-zinc-400 max-w-2xl font-mono text-sm"> |
62 | | - A curated selection of technologies and tools I use to bring digital experiences to life. |
63 | | - </p> |
| 59 | + <section id="skills" className="py-24 md:py-32 px-6 md:px-12 border-t border-zinc-800 relative overflow-hidden"> |
| 60 | + {/* Subtle background texture */} |
| 61 | + <div className="absolute inset-0 opacity-[0.02] pointer-events-none"> |
| 62 | + <div className="absolute inset-0 bg-[url('https://www.transparenttextures.com/patterns/carbon-fibre.png')]" /> |
64 | 63 | </div> |
65 | 64 |
|
66 | | - <div className="grid grid-cols-1 md:grid-cols-4 md:grid-rows-3 gap-4 h-auto md:h-[800px]"> |
67 | | - {/* Main Skill - React/Frontend (Large) */} |
68 | | - <SkillCard |
69 | | - title="Frontend Engineering" |
70 | | - icon={Layout} |
71 | | - className="md:col-span-2 md:row-span-2" |
72 | | - delay={0.1} |
73 | | - > |
74 | | - <p className="text-zinc-400 text-sm mb-6"> |
75 | | - Building highly interactive, performant, and accessible user interfaces using modern frameworks. |
76 | | - </p> |
77 | | - <div className="bg-zinc-950 rounded-xl p-4 border border-zinc-800 font-mono text-[11px] text-zinc-500 overflow-hidden"> |
78 | | - <div className="flex gap-2 mb-2"> |
79 | | - <div className="w-2 h-2 rounded-full bg-red-500/50" /> |
80 | | - <div className="w-2 h-2 rounded-full bg-amber-500/50" /> |
81 | | - <div className="w-2 h-2 rounded-full bg-green-500/50" /> |
| 65 | + <div className="max-w-7xl mx-auto relative z-10"> |
| 66 | + <div className="mb-12"> |
| 67 | + <motion.h2 |
| 68 | + initial={{ opacity: 0, y: 20 }} |
| 69 | + whileInView={{ opacity: 1, y: 0 }} |
| 70 | + viewport={{ once: true }} |
| 71 | + className="font-heading text-3xl sm:text-4xl font-bold uppercase tracking-tight text-white mb-2" |
| 72 | + > |
| 73 | + {t.skills.title} |
| 74 | + </motion.h2> |
| 75 | + <p className="font-mono text-sm text-zinc-500 mb-4">{t.skills.subtitle}</p> |
| 76 | + <div className="h-px w-16 bg-amber-500 mb-12" /> |
| 77 | + </div> |
| 78 | + |
| 79 | + <div className="grid grid-cols-1 md:grid-cols-4 md:grid-rows-3 gap-4 h-auto md:h-[850px]"> |
| 80 | + {/* Main Skill - Platform Engineering (Large) */} |
| 81 | + <SkillCard |
| 82 | + title="Platform Engineering" |
| 83 | + icon={Cloud} |
| 84 | + className="md:col-span-2 md:row-span-2" |
| 85 | + delay={0.1} |
| 86 | + > |
| 87 | + <p className="text-zinc-400 text-sm mb-6"> |
| 88 | + Orchestrating mission-critical workloads on OpenShift and Kubernetes with a focus on high availability and scalability. |
| 89 | + </p> |
| 90 | + <div className="bg-zinc-950 rounded-xl p-4 border border-zinc-800 font-mono text-[11px] text-zinc-500 overflow-hidden"> |
| 91 | + <div className="flex items-center justify-between mb-3 border-b border-zinc-800 pb-2"> |
| 92 | + <span className="text-amber-500/80">cluster-status.sh</span> |
| 93 | + <div className="flex gap-1"> |
| 94 | + <div className="w-1.5 h-1.5 rounded-full bg-green-500" /> |
| 95 | + <span className="text-[9px] text-green-500/70 uppercase">Healthy</span> |
| 96 | + </div> |
| 97 | + </div> |
| 98 | + <div className="space-y-1"> |
| 99 | + <div className="flex justify-between"> |
| 100 | + <span>Nodes:</span> |
| 101 | + <span className="text-zinc-300">Ready (12/12)</span> |
| 102 | + </div> |
| 103 | + <div className="flex justify-between"> |
| 104 | + <span>Deployments:</span> |
| 105 | + <span className="text-zinc-300">Synced (ArgoCD)</span> |
| 106 | + </div> |
| 107 | + <div className="flex justify-between"> |
| 108 | + <span>Operators:</span> |
| 109 | + <span className="text-zinc-300">Up-to-date</span> |
| 110 | + </div> |
| 111 | + </div> |
| 112 | + </div> |
| 113 | + </SkillCard> |
| 114 | + |
| 115 | + {/* Infrastructure as Code (Medium) */} |
| 116 | + <SkillCard |
| 117 | + title="Infrastructure as Code" |
| 118 | + icon={Layers} |
| 119 | + className="md:col-span-2 md:row-span-1" |
| 120 | + delay={0.2} |
| 121 | + > |
| 122 | + <div className="bg-zinc-950 rounded-xl p-3 border border-zinc-800 font-mono text-[10px] text-zinc-500"> |
| 123 | + <code className="block"> |
| 124 | + <span className="text-purple-400">resource</span> <span className="text-amber-500">"aws_instance"</span> <span className="text-blue-400">"web"</span> {<br /> |
| 125 | + <span className="text-zinc-400">ami</span> = <span className="text-green-400">data.ami.id</span><br /> |
| 126 | + <span className="text-zinc-400">instance_type</span> = <span className="text-green-400">"t3.medium"</span><br /> |
| 127 | + } |
| 128 | + </code> |
82 | 129 | </div> |
83 | | - <code className="block"> |
84 | | - <span className="text-purple-400">const</span> <span className="text-blue-400">Portfolio</span> = () => { <br /> |
85 | | - <span className="text-purple-400">return</span> (<br /> |
86 | | - <<span className="text-amber-500">motion.div</span><br /> |
87 | | - <span className="text-blue-300">animate</span>={{ <span className="text-blue-300">scale</span>: <span className="text-orange-400">1</span> }}<br /> |
88 | | - <span className="text-blue-300">whileHover</span>={{ <span className="text-blue-300">y</span>: -<span className="text-orange-400">5</span> }}<br /> |
89 | | - /><br /> |
90 | | - );<br /> |
91 | | - }; |
92 | | - </code> |
93 | | - </div> |
94 | | - </SkillCard> |
| 130 | + </SkillCard> |
| 131 | + |
| 132 | + {/* CI/CD & GitOps (Small) */} |
| 133 | + <SkillCard |
| 134 | + title="GitOps & CI/CD" |
| 135 | + icon={GitBranch} |
| 136 | + delay={0.3} |
| 137 | + > |
| 138 | + <div className="flex items-center gap-2 mt-2"> |
| 139 | + <div className="flex -space-x-2"> |
| 140 | + <div className="w-6 h-6 rounded-full bg-zinc-800 border border-zinc-900 flex items-center justify-center text-[8px] text-zinc-400">Git</div> |
| 141 | + <div className="w-6 h-6 rounded-full bg-zinc-800 border border-zinc-900 flex items-center justify-center text-[8px] text-zinc-400">Argo</div> |
| 142 | + <div className="w-6 h-6 rounded-full bg-zinc-800 border border-zinc-900 flex items-center justify-center text-[8px] text-zinc-400">Helm</div> |
| 143 | + </div> |
| 144 | + </div> |
| 145 | + </SkillCard> |
95 | 146 |
|
96 | | - {/* Performance (Medium) */} |
97 | | - <SkillCard |
98 | | - title="Optimization" |
99 | | - icon={Zap} |
100 | | - className="md:col-span-2 md:row-span-1" |
101 | | - delay={0.2} |
102 | | - > |
103 | | - <div className="flex items-end gap-4"> |
104 | | - <div className="flex-1"> |
105 | | - <div className="h-2 bg-zinc-800 rounded-full overflow-hidden"> |
| 147 | + {/* Monitoring (Small) */} |
| 148 | + <SkillCard |
| 149 | + title="Observability" |
| 150 | + icon={Activity} |
| 151 | + delay={0.4} |
| 152 | + > |
| 153 | + <div className="mt-2 h-8 flex items-end gap-0.5"> |
| 154 | + {[40, 70, 45, 90, 65, 80, 50, 85].map((h, i) => ( |
106 | 155 | <motion.div |
107 | | - initial={{ width: 0 }} |
108 | | - whileInView={{ width: '98%' }} |
109 | | - transition={{ duration: 1.5, delay: 0.5 }} |
110 | | - className="h-full bg-amber-500" |
| 156 | + key={i} |
| 157 | + initial={{ height: 0 }} |
| 158 | + whileInView={{ height: `${h}%` }} |
| 159 | + transition={{ duration: 0.5, delay: 0.5 + (i * 0.05) }} |
| 160 | + className="flex-1 bg-amber-500/40 rounded-t-sm" |
111 | 161 | /> |
112 | | - </div> |
113 | | - <div className="flex justify-between mt-2 font-mono text-[10px] text-zinc-500 uppercase"> |
114 | | - <span>Lighthouse Score</span> |
115 | | - <span className="text-amber-500">98/100</span> |
116 | | - </div> |
| 162 | + ))} |
117 | 163 | </div> |
118 | | - </div> |
119 | | - </SkillCard> |
| 164 | + </SkillCard> |
120 | 165 |
|
121 | | - {/* Architecture (Small) */} |
122 | | - <SkillCard |
123 | | - title="Architecture" |
124 | | - icon={Layers} |
125 | | - delay={0.3} |
126 | | - /> |
| 166 | + {/* Automation (Small) */} |
| 167 | + <SkillCard |
| 168 | + title="Automation" |
| 169 | + icon={Terminal} |
| 170 | + className="md:col-span-1 md:row-span-1" |
| 171 | + delay={0.5} |
| 172 | + /> |
127 | 173 |
|
128 | | - {/* Backend (Small) */} |
129 | | - <SkillCard |
130 | | - title="Backend" |
131 | | - icon={Database} |
132 | | - delay={0.4} |
133 | | - /> |
| 174 | + {/* Cloud Providers (Medium) */} |
| 175 | + <SkillCard |
| 176 | + title="Cloud Ecosystem" |
| 177 | + icon={Globe} |
| 178 | + className="md:col-span-2 md:row-span-1" |
| 179 | + delay={0.6} |
| 180 | + > |
| 181 | + <div className="flex flex-wrap gap-2 mt-2"> |
| 182 | + {['AWS', 'Azure', 'OpenShift', 'GitLab'].map(tag => ( |
| 183 | + <span key={tag} className="px-2 py-1 bg-zinc-800/50 rounded-md text-[10px] font-mono text-zinc-400 border border-zinc-700/50"> |
| 184 | + {tag} |
| 185 | + </span> |
| 186 | + ))} |
| 187 | + </div> |
| 188 | + </SkillCard> |
134 | 189 |
|
135 | | - {/* Mobile (Small) */} |
136 | | - <SkillCard |
137 | | - title="Mobile First" |
138 | | - icon={Smartphone} |
139 | | - className="md:col-span-1 md:row-span-1" |
140 | | - delay={0.5} |
141 | | - /> |
| 190 | + {/* Security (Small) */} |
| 191 | + <SkillCard |
| 192 | + title="Cloud Security" |
| 193 | + icon={ShieldCheck} |
| 194 | + delay={0.7} |
| 195 | + /> |
| 196 | + </div> |
142 | 197 |
|
143 | | - {/* Design (Medium) */} |
144 | | - <SkillCard |
145 | | - title="UI/UX Design" |
146 | | - icon={Palette} |
147 | | - className="md:col-span-2 md:row-span-1" |
148 | | - delay={0.6} |
149 | | - > |
150 | | - <div className="flex gap-2 mt-2"> |
151 | | - {['#F59E0B', '#18181B', '#27272A', '#3F3F46'].map(color => ( |
152 | | - <div |
153 | | - key={color} |
154 | | - className="w-6 h-6 rounded-lg border border-white/10" |
155 | | - style={{ backgroundColor: color }} |
156 | | - /> |
157 | | - ))} |
| 198 | + {/* Certifications */} |
| 199 | + {t.skills.certifications && ( |
| 200 | + <div className="mt-16"> |
| 201 | + <h3 className="font-heading text-xl font-bold uppercase tracking-tight text-white mb-2"> |
| 202 | + {t.skills.certTitle} |
| 203 | + </h3> |
| 204 | + <div className="h-px w-12 bg-amber-500 mb-6" /> |
| 205 | + <div className="flex flex-wrap gap-2"> |
| 206 | + {t.skills.certifications.map((cert: string) => ( |
| 207 | + <span |
| 208 | + key={cert} |
| 209 | + className="font-mono text-[11px] tracking-wider text-amber-500/80 border border-zinc-800 bg-[#121212]/60 px-3 py-1.5 rounded-sm hover:border-amber-500/40 hover:bg-[#121212] transition-colors cursor-default flex items-center" |
| 210 | + > |
| 211 | + <ShieldCheck size={10} className="mr-1.5 opacity-60" /> |
| 212 | + {cert} |
| 213 | + </span> |
| 214 | + ))} |
| 215 | + </div> |
158 | 216 | </div> |
159 | | - </SkillCard> |
160 | | - |
161 | | - {/* Terminal/DevOps (Small) */} |
162 | | - <SkillCard |
163 | | - title="DevOps" |
164 | | - icon={Terminal} |
165 | | - delay={0.7} |
166 | | - /> |
| 217 | + )} |
167 | 218 | </div> |
168 | 219 | </section> |
169 | 220 | ); |
|
0 commit comments