Skills section update
This commit is contained in:
@@ -4,6 +4,14 @@
|
|||||||
* Flowing chip layout with category grouping
|
* Flowing chip layout with category grouping
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import {
|
||||||
|
CpuIcon,
|
||||||
|
PaletteIcon,
|
||||||
|
RocketIcon,
|
||||||
|
ShieldCheckIcon,
|
||||||
|
TerminalIcon,
|
||||||
|
ZapIcon,
|
||||||
|
} from "lucide-react";
|
||||||
import { useEffect, useRef } from "react";
|
import { useEffect, useRef } from "react";
|
||||||
|
|
||||||
function useReveal(threshold = 0.1) {
|
function useReveal(threshold = 0.1) {
|
||||||
@@ -18,7 +26,7 @@ function useReveal(threshold = 0.1) {
|
|||||||
observer.disconnect();
|
observer.disconnect();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ threshold }
|
{ threshold },
|
||||||
);
|
);
|
||||||
observer.observe(el);
|
observer.observe(el);
|
||||||
return () => observer.disconnect();
|
return () => observer.disconnect();
|
||||||
@@ -26,7 +34,8 @@ function useReveal(threshold = 0.1) {
|
|||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
const CODE_VISUAL = "https://d2xsxph8kpxj0f.cloudfront.net/310519663439135967/RkRL4wd7YzNoLyaN7suWbR/code-visual-96fdFEYLcFy2ct3UAAmiG6.webp";
|
const CODE_VISUAL =
|
||||||
|
"https://d2xsxph8kpxj0f.cloudfront.net/310519663439135967/RkRL4wd7YzNoLyaN7suWbR/code-visual-96fdFEYLcFy2ct3UAAmiG6.webp";
|
||||||
|
|
||||||
interface SkillCategory {
|
interface SkillCategory {
|
||||||
label: string;
|
label: string;
|
||||||
@@ -106,7 +115,11 @@ export default function SkillsSection() {
|
|||||||
const contentRef = useReveal(0.05);
|
const contentRef = useReveal(0.05);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section id="skills" className="py-32 relative" style={{ background: "#080808" }}>
|
<section
|
||||||
|
id="skills"
|
||||||
|
className="py-32 relative"
|
||||||
|
style={{ background: "#080808" }}
|
||||||
|
>
|
||||||
<div className="absolute top-0 left-0 right-0 h-px bg-gradient-to-r from-transparent via-white/10 to-transparent" />
|
<div className="absolute top-0 left-0 right-0 h-px bg-gradient-to-r from-transparent via-white/10 to-transparent" />
|
||||||
|
|
||||||
<div className="max-w-6xl mx-auto px-6">
|
<div className="max-w-6xl mx-auto px-6">
|
||||||
@@ -115,9 +128,7 @@ export default function SkillsSection() {
|
|||||||
<div className="terminal-label mb-4">> cat skills.json</div>
|
<div className="terminal-label mb-4">> cat skills.json</div>
|
||||||
<div className="flex flex-col sm:flex-row sm:items-end justify-between gap-4">
|
<div className="flex flex-col sm:flex-row sm:items-end justify-between gap-4">
|
||||||
<h2 className="section-heading text-4xl sm:text-5xl text-white leading-tight">
|
<h2 className="section-heading text-4xl sm:text-5xl text-white leading-tight">
|
||||||
Tech I Work
|
Tech I Work <span className="text-white/40">With</span>
|
||||||
<br />
|
|
||||||
<span className="text-white/40">With</span>
|
|
||||||
</h2>
|
</h2>
|
||||||
<div className="flex items-center gap-4 terminal-label text-xs">
|
<div className="flex items-center gap-4 terminal-label text-xs">
|
||||||
<span className="flex items-center gap-1.5">
|
<span className="flex items-center gap-1.5">
|
||||||
@@ -143,7 +154,9 @@ export default function SkillsSection() {
|
|||||||
{skillCategories.map((cat) => (
|
{skillCategories.map((cat) => (
|
||||||
<div key={cat.label}>
|
<div key={cat.label}>
|
||||||
<div className="flex items-center gap-3 mb-4">
|
<div className="flex items-center gap-3 mb-4">
|
||||||
<span className="terminal-label text-xs">{cat.terminalLabel}</span>
|
<span className="terminal-label text-xs">
|
||||||
|
{cat.terminalLabel}
|
||||||
|
</span>
|
||||||
<div className="flex-1 h-px bg-white/5" />
|
<div className="flex-1 h-px bg-white/5" />
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-wrap gap-2">
|
<div className="flex flex-wrap gap-2">
|
||||||
@@ -152,8 +165,12 @@ export default function SkillsSection() {
|
|||||||
key={skill.name}
|
key={skill.name}
|
||||||
className="skill-chip"
|
className="skill-chip"
|
||||||
style={{
|
style={{
|
||||||
background: skill.level ? levelColors[skill.level] : undefined,
|
background: skill.level
|
||||||
borderColor: skill.level ? levelBorders[skill.level] : undefined,
|
? levelColors[skill.level]
|
||||||
|
: undefined,
|
||||||
|
borderColor: skill.level
|
||||||
|
? levelBorders[skill.level]
|
||||||
|
: undefined,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{skill.name}
|
{skill.name}
|
||||||
@@ -174,7 +191,9 @@ export default function SkillsSection() {
|
|||||||
className="w-full h-48 object-cover opacity-70"
|
className="w-full h-48 object-cover opacity-70"
|
||||||
/>
|
/>
|
||||||
<div className="p-4">
|
<div className="p-4">
|
||||||
<div className="terminal-label text-xs mb-1">$ git log --oneline</div>
|
<div className="terminal-label text-xs mb-1">
|
||||||
|
$ git log --oneline
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
className="text-white/50 text-xs leading-relaxed"
|
className="text-white/50 text-xs leading-relaxed"
|
||||||
style={{ fontFamily: "'JetBrains Mono', monospace" }}
|
style={{ fontFamily: "'JetBrains Mono', monospace" }}
|
||||||
@@ -188,19 +207,30 @@ export default function SkillsSection() {
|
|||||||
|
|
||||||
{/* Interests */}
|
{/* Interests */}
|
||||||
<div className="glass rounded-2xl p-5">
|
<div className="glass rounded-2xl p-5">
|
||||||
<div className="terminal-label text-xs mb-4">> interests/</div>
|
<div className="terminal-label text-xs mb-4">
|
||||||
|
> interests/
|
||||||
|
</div>
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
{[
|
{[
|
||||||
{ icon: "🔐", label: "Hacking & Security" },
|
{
|
||||||
{ icon: "🖥️", label: "Low-level Systems" },
|
icon: <ShieldCheckIcon size={20} />,
|
||||||
{ icon: "🎨", label: "UI/UX Design" },
|
label: "Hacking & Security",
|
||||||
{ icon: "🚀", label: "SaaS & Startups" },
|
},
|
||||||
{ icon: "🦀", label: "Rust Ecosystem" },
|
{ icon: <CpuIcon size={20} />, label: "Low-level Systems" },
|
||||||
{ icon: "🐧", label: "Linux & Open Source" },
|
{ icon: <PaletteIcon size={20} />, label: "UI/UX Design" },
|
||||||
|
{
|
||||||
|
icon: <RocketIcon size={20} />,
|
||||||
|
label: "SaaS & Startups",
|
||||||
|
},
|
||||||
|
{ icon: <ZapIcon size={20} />, label: "Rust Ecosystem" },
|
||||||
|
{
|
||||||
|
icon: <TerminalIcon size={20} />,
|
||||||
|
label: "Linux & Open Source",
|
||||||
|
},
|
||||||
].map((item) => (
|
].map((item) => (
|
||||||
<div
|
<div
|
||||||
key={item.label}
|
key={item.label}
|
||||||
className="flex items-center gap-3 text-sm text-white/60"
|
className="flex items-center gap-2 text-sm text-white/60"
|
||||||
style={{ fontFamily: "'DM Sans', sans-serif" }}
|
style={{ fontFamily: "'DM Sans', sans-serif" }}
|
||||||
>
|
>
|
||||||
<span className="text-base">{item.icon}</span>
|
<span className="text-base">{item.icon}</span>
|
||||||
|
|||||||
Reference in New Issue
Block a user