Skip to content

Commit 9d16349

Browse files
committed
feat: new about page for skills
1 parent 1c17f1e commit 9d16349

File tree

13 files changed

+625
-1
lines changed

13 files changed

+625
-1
lines changed

public/about-me/cards.piml

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
(cards)
2+
> (item)
3+
(id) core
4+
(title) Core Systems & Languages
5+
(description) Mastery of multi-paradigm programming with a focus on high-performance, memory-safe, and concurrent system development.
6+
(variant) dark
7+
(topBadge) Lvl_Senior
8+
(bgImage) /images/bg/8.webp
9+
(tags)
10+
> (tag)
11+
(label) Golang (Go)
12+
(icon) CodeIcon
13+
> (tag)
14+
(label) Rust / C++ / C
15+
(icon) TerminalWindowIcon
16+
> (tag)
17+
(label) Java / JavaFX
18+
(icon) CpuIcon
19+
> (tag)
20+
(label) Python
21+
(icon) CodeIcon
22+
> (tag)
23+
(label) TS / JS / Node
24+
(icon) LightningIcon
25+
> (tag)
26+
(label) SQL / NoSQL
27+
(icon) DatabaseIcon
28+
29+
> (item)
30+
(id) distributed
31+
(title) Distributed Architecture
32+
(description) Designing the skeleton of modern scale. Expertise in microservices, event-driven systems, and high-availability patterns.
33+
(variant) emerald
34+
(topBadge) Arch_Specialist
35+
(bgImage) /images/bg/1.webp
36+
(tags)
37+
> (tag)
38+
(label) Microservices
39+
(icon) HardDrivesIcon
40+
> (tag)
41+
(label) gRPC / Protobuf
42+
(icon) TreeStructureIcon
43+
> (tag)
44+
(label) Message Queues
45+
(icon) LightningIcon
46+
> (tag)
47+
(label) Redis / Caching
48+
(icon) DatabaseIcon
49+
> (tag)
50+
(label) API Gateway
51+
(icon) GlobeIcon
52+
> (tag)
53+
(label) Sys Design
54+
(icon) CodeIcon
55+
56+
> (item)
57+
(id) cloud
58+
(title) Infrastructure & DevOps
59+
(description) Automating the bridge between code and production. Full-cycle CI/CD, cloud orchestration, and security-first deployment.
60+
(variant) amber
61+
(topBadge) Ops_Lead
62+
(bgImage) /images/bg/2.webp
63+
(tags)
64+
> (tag)
65+
(label) Kubernetes
66+
(icon) CloudIcon
67+
> (tag)
68+
(label) Docker / Podman
69+
(icon) HardDrivesIcon
70+
> (tag)
71+
(label) Terraform / IaC
72+
(icon) WrenchIcon
73+
> (tag)
74+
(label) AWS / GCP / Azure
75+
(icon) GlobeIcon
76+
> (tag)
77+
(label) CI/CD (Jenkins)
78+
(icon) CpuIcon
79+
> (tag)
80+
(label) Ansible / Chef
81+
(icon) WrenchIcon
82+
83+
> (item)
84+
(id) smartcities
85+
(title) Smart Cities & IoT
86+
(description) Developing critical urban infrastructure. Toll collection, smart transport, and large-scale IoT data processing.
87+
(variant) crimson
88+
(topBadge) Urban_Tech
89+
(bgImage) /images/bg/4.webp
90+
(tags)
91+
> (tag)
92+
(label) Aselsan SC
93+
(icon) TreeStructureIcon
94+
> (tag)
95+
(label) Toll Systems
96+
(icon) HardDrivesIcon
97+
> (tag)
98+
(label) Smart Transport
99+
(icon) GlobeIcon
100+
> (tag)
101+
(label) IoT Gateways
102+
(icon) CpuIcon
103+
> (tag)
104+
(label) Data Streaming
105+
(icon) LightningIcon
106+
107+
> (item)
108+
(id) research
109+
(title) Academic & Visual Labs
110+
(description) Merging behavioral science with immersive technology. Published research in usability and food education environments.
111+
(variant) light
112+
(topBadge) Scholar
113+
(bgImage) /images/bg/7.webp
114+
(tags)
115+
> (tag)
116+
(label) Virtual Cafeteria
117+
(icon) EyeIcon
118+
(href) https://doi.org/10.1016/j.jneb.2020.08.001
119+
> (tag)
120+
(label) Usability Study
121+
(icon) FlaskIcon
122+
> (tag)
123+
(label) ACM / JNEB
124+
(icon) BookOpenIcon
125+
> (tag)
126+
(label) Immersive Tech
127+
(icon) SparkleIcon
128+
> (tag)
129+
(label) VR / AR / MR
130+
(icon) EyeIcon
131+
132+
> (item)
133+
(id) creative
134+
(title) Creative Synthesis
135+
(description) Exploring the space where code meets art. Music production, custom hardware, and digital storytelling.
136+
(variant) crimson
137+
(topBadge) Synth_Artist
138+
(bgImage) /images/bg/6.webp
139+
(tags)
140+
> (tag)
141+
(label) Music Prod.
142+
(icon) MusicNotesIcon
143+
> (tag)
144+
(label) Mech Keyboards
145+
(icon) KeyboardIcon
146+
> (tag)
147+
(label) Narrative Games
148+
(icon) GlobeIcon
149+
> (tag)
150+
(label) Audio Eng.
151+
(icon) MusicNotesIcon
152+
> (tag)
153+
(label) Github
154+
(icon) GithubLogoIcon
155+
(href) https://github.com/fezcode
156+
> (tag)
157+
(label) LinkedIn
158+
(icon) LinkedinLogoIcon
159+
(href) https://www.linkedin.com/in/ahmed-samil-bulbul/

public/images/bg/0.webp

730 KB
Loading

public/images/bg/1.webp

841 KB
Loading

public/images/bg/2.webp

622 KB
Loading

public/images/bg/3.webp

748 KB
Loading

public/images/bg/4.webp

767 KB
Loading

public/images/bg/6.webp

698 KB
Loading

public/images/bg/7.webp

784 KB
Loading

public/images/bg/8.webp

771 KB
Loading
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
import React, {useMemo} from 'react';
2+
import {motion} from 'framer-motion';
3+
import {
4+
SparkleIcon,
5+
AtomIcon,
6+
} from '@phosphor-icons/react';
7+
import {appIcons} from '../utils/appIcons';
8+
9+
/**
10+
* VisionAwakeningCard
11+
* A brutalist, futuristic card component inspired by the "A New Lens on Reality" design.
12+
*/
13+
const VisionAwakeningCard = ({
14+
variant = 'dark',
15+
colors: customColors,
16+
showFooter = true,
17+
topBadge,
18+
title = "",
19+
description,
20+
tags = [],
21+
secondaryTags = [],
22+
footerText = "",
23+
subNotes = []
24+
}) => {
25+
const getIcon = (icon) => {
26+
if (React.isValidElement(icon)) return icon;
27+
if (typeof icon === 'string' && appIcons[icon]) {
28+
const IconComp = appIcons[icon];
29+
return <IconComp weight="fill"/>;
30+
}
31+
return <SparkleIcon weight="fill"/>;
32+
};
33+
const getSecIcon = (icon) => {
34+
if (React.isValidElement(icon)) return icon;
35+
if (typeof icon === 'string' && appIcons[icon]) {
36+
const IconComp = appIcons[icon];
37+
return <IconComp weight="bold"/>;
38+
}
39+
return <AtomIcon weight="bold"/>;
40+
};
41+
const defaultThemes = {
42+
dark: {
43+
container: "bg-[#1a1b3a] text-white border-[#2a2b5a]",
44+
pattern: "opacity-20 text-blue-400",
45+
pill: "bg-white/10 border-white/20 text-blue-100",
46+
pillIcon: "text-blue-300",
47+
footer: "text-white/60",
48+
subNote: "text-white/40",
49+
isDark: true,
50+
}, light: {
51+
container: "bg-[#e2e4ff] text-[#1a1b3a] border-white",
52+
pattern: "opacity-10 text-blue-900",
53+
pill: "bg-white border-blue-200 text-[#1a1b3a]",
54+
pillIcon: "text-blue-600",
55+
footer: "text-[#1a1b3a]/60",
56+
subNote: "text-[#1a1b3a]/40",
57+
isDark: false,
58+
}, emerald: {
59+
container: "bg-[#062c24] text-[#a7f3d0] border-[#064e3b]",
60+
pattern: "opacity-20 text-[#10b981]",
61+
pill: "bg-[#064e3b]/50 border-[#10b981]/30 text-[#a7f3d0]",
62+
pillIcon: "text-[#34d399]",
63+
footer: "text-[#a7f3d0]/60",
64+
subNote: "text-[#a7f3d0]/40",
65+
isDark: true,
66+
}, amber: {
67+
container: "bg-[#451a03] text-[#fde68a] border-[#78350f]",
68+
pattern: "opacity-20 text-[#f59e0b]",
69+
pill: "bg-[#78350f]/50 border-[#f59e0b]/30 text-[#fde68a]",
70+
pillIcon: "text-[#fbbf24]",
71+
footer: "text-[#fde68a]/60",
72+
subNote: "text-[#fde68a]/40",
73+
isDark: true,
74+
}, crimson: {
75+
container: "bg-[#450a0a] text-[#fecaca] border-[#7f1d1d]",
76+
pattern: "opacity-20 text-[#ef4444]",
77+
pill: "bg-[#7f1d1d]/50 border-[#ef4444]/30 text-[#fecaca]",
78+
pillIcon: "text-[#f87171]",
79+
footer: "text-[#fecaca]/60",
80+
subNote: "text-[#fecaca]/40",
81+
isDark: true,
82+
}
83+
};
84+
const themeClasses = customColors || defaultThemes[variant] || defaultThemes.dark;
85+
const isCustomDark = themeClasses.isDark;
86+
// Simulate the character pattern background
87+
const patternLines = useMemo(() => {
88+
const patternChars = "X01%&*#@+=-:. ".split("");
89+
return Array.from({length: 60}).map(() => Array.from({length: 150}).map(() => patternChars[Math.floor(Math.random() * patternChars.length)]).join(""));
90+
}, []);
91+
return (<motion.div
92+
className={`relative w-full max-w-xl h-[520px] md:h-[620px] rounded-[2rem] overflow-hidden border-8 p-6 md:p-8 flex flex-col transition-colors duration-500 group ${themeClasses.container}`}
93+
> {/* Background Character Pattern */}
94+
<div
95+
className={`absolute inset-0 font-mono text-[6px] md:text-[8px] leading-none select-none pointer-events-none overflow-hidden whitespace-pre break-all ${themeClasses.pattern}`}>
96+
{patternLines.join('\n')}
97+
</div>
98+
{/* Hover Diagonal Scanline */}
99+
<div
100+
className="absolute inset-0 z-[5] pointer-events-none overflow-hidden opacity-0 group-hover:opacity-100 transition-opacity duration-500">
101+
<motion.div
102+
animate={{
103+
x: ['-100%', '100%'], y: ['-100%', '100%'],
104+
}}
105+
transition={{
106+
duration: 2, repeat: Infinity, ease: "linear"
107+
}}
108+
className="absolute inset-0 bg-gradient-to-br from-transparent via-white/10 to-transparent h-[200%] w-[200%] -top-[50%] -left-[50%]"
109+
style={{rotate: '45deg'}}
110+
/>
111+
</div>
112+
{/* Top Header Section */}
113+
<div className="relative z-10 flex justify-between items-start">
114+
<div className="w-10 h-10 md:w-16 md:h-16 mb-8">
115+
<AtomIcon size="100%" weight="duotone" className={isCustomDark ? "text-blue-300" : "text-blue-600"}/>
116+
</div>
117+
<div
118+
className={`px-3 py-1 rounded-sm border text-[10px] font-mono uppercase tracking-widest ${themeClasses.pill} ${topBadge ? 'opacity-100' : 'opacity-0'}`}>
119+
{topBadge || '---'}
120+
</div>
121+
</div>
122+
<div className="relative z-10 space-y-3">
123+
<h2 className="text-2xl md:text-4xl font-outfit font-black uppercase leading-tight tracking-tight max-w-[95%]">
124+
{title}
125+
</h2>
126+
{description && (<p
127+
className="font-mono text-[10px] md:text-xs text-current opacity-70 leading-relaxed uppercase tracking-wider">
128+
{description}
129+
</p>)}
130+
</div>
131+
{/* Tags Grid */}
132+
<div className="relative z-10 space-y-4 mt-6 flex-grow overflow-y-auto">
133+
<div className="flex flex-wrap gap-2 md:gap-3">
134+
{tags.map((tag, i) => {
135+
const TagComp = tag.href ? 'a' : 'div';
136+
return (<TagComp
137+
key={i}
138+
href={tag.href}
139+
target={tag.href ? "_blank" : undefined}
140+
rel={tag.href ? "noopener noreferrer" : undefined}
141+
className={`flex items-center gap-2 px-3 md:px-4 py-2 md:py-2.5 rounded-full border transition-all min-w-0 ${themeClasses.pill} ${tag.href ? `border-dashed hover:border-solid hover:bg-current/[0.2] cursor-pointer group/tag` : 'opacity-90'}`}
142+
>
143+
<span className={`text-base md:text-xl flex-shrink-0 ${themeClasses.pillIcon}`}>
144+
{getIcon(tag.icon)}
145+
</span>
146+
<span
147+
className="font-syne font-bold text-[9px] md:text-xs uppercase tracking-wide min-w-0 flex items-center gap-1">
148+
{tag.label}
149+
{tag.href && <span
150+
className="text-[10px] opacity-40 group-hover/tag:opacity-100 group-hover/tag:translate-x-0.5 transition-all"></span>}
151+
</span>
152+
</TagComp>);
153+
})}
154+
</div>
155+
{/* Secondary Wide Tags */}
156+
<div className="space-y-2">
157+
{secondaryTags.map((tag, i) => {
158+
const TagComp = tag.href ? 'a' : 'div';
159+
return (<TagComp
160+
key={i}
161+
href={tag.href}
162+
target={tag.href ? "_blank" : undefined}
163+
rel={tag.href ? "noopener noreferrer" : undefined}
164+
className={`flex items-center justify-between px-5 py-2 md:py-2.5 rounded-full border text-[9px] md:text-xs font-mono uppercase tracking-widest overflow-hidden transition-all ${themeClasses.pill} ${tag.href ? `border-dashed hover:border-solid hover:bg-current/[0.1] cursor-pointer group/sectag` : ''}`}
165+
>
166+
<div className="flex items-center gap-2 min-w-0 flex-1">
167+
<span className={`flex-shrink-0 ${themeClasses.pillIcon}`}>{getSecIcon(tag.icon)}</span>
168+
<span className="break-words">
169+
{tag.label}
170+
{tag.href && <span
171+
className="ml-2 opacity-40 group-hover/sectag:opacity-100 inline-block group-hover/sectag:translate-x-0.5 transition-all"></span>}
172+
</span>
173+
</div>
174+
{!tag.href && (<div className="w-1.5 h-1.5 rounded-full bg-current opacity-50 flex-shrink-0 ml-2"/>)}
175+
</TagComp>);
176+
})}
177+
</div>
178+
</div>
179+
{/* Footer Section */}
180+
{showFooter && (<div
181+
className="relative z-10 mt-auto pt-6 border-t border-current/10 flex flex-col md:flex-row gap-6 md:gap-10 transition-opacity duration-200"
182+
>
183+
<p
184+
className={`flex-1 text-[10px] md:text-xs font-mono leading-relaxed uppercase tracking-tighter ${themeClasses.footer}`}>
185+
{footerText}
186+
</p>
187+
<div className="flex gap-4 md:w-1/3">
188+
{subNotes.map((note, i) => (<p key={i} className={`text-[8px] font-mono leading-tight ${themeClasses.subNote}`}>
189+
{note}
190+
</p>))}
191+
</div>
192+
</div>)}
193+
{/* Subtle Overlay Glow */}
194+
<div className="absolute inset-0 bg-gradient-to-br from-white/5 to-transparent pointer-events-none"/>
195+
</motion.div>);
196+
};
197+
export default VisionAwakeningCard;

0 commit comments

Comments
 (0)