abhishek-portfolio-template 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -0
- package/bin/cli.js +54 -0
- package/package.json +27 -0
- package/template/components.json +22 -0
- package/template/next.config.ts +79 -0
- package/template/package.json +43 -0
- package/template/postcss.config.js +6 -0
- package/template/public/BoliviaSignature-ZpWnz.ttf +0 -0
- package/template/public/Gemini_Generated_Image_xc97toxc97toxc97.png +0 -0
- package/template/public/Hendrigo.otf +0 -0
- package/template/public/audiomass-output.mp3 +0 -0
- package/template/public/file.svg +1 -0
- package/template/public/globe.svg +1 -0
- package/template/public/googlec77e59474f5a09cb.html +1 -0
- package/template/public/icon-192x192.png +0 -0
- package/template/public/icon-512x512.png +0 -0
- package/template/public/next.svg +1 -0
- package/template/public/paper sound .mpeg +0 -0
- package/template/public/removebg.png +0 -0
- package/template/public/resume.pdf +0 -0
- package/template/public/sw.js +1 -0
- package/template/public/swe-worker-5c72df51bb1f6ee0.js +1 -0
- package/template/public/vercel.svg +1 -0
- package/template/public/window.svg +1 -0
- package/template/public/workbox-f1770938.js +1 -0
- package/template/src/app/about/page.tsx +91 -0
- package/template/src/app/actions/optimize-text.ts +54 -0
- package/template/src/app/gaming/page.tsx +308 -0
- package/template/src/app/github/[username]/page.tsx +97 -0
- package/template/src/app/globals.css +321 -0
- package/template/src/app/layout.tsx +39 -0
- package/template/src/app/manifest.ts +25 -0
- package/template/src/app/not-found.tsx +16 -0
- package/template/src/app/page.tsx +28 -0
- package/template/src/app/robots.ts +12 -0
- package/template/src/app/sitemap.ts +38 -0
- package/template/src/app/template.tsx +5 -0
- package/template/src/app/works/[slug]/page.tsx +50 -0
- package/template/src/app/works/client.tsx +44 -0
- package/template/src/app/works/page.tsx +24 -0
- package/template/src/components/about/about-client.tsx +259 -0
- package/template/src/components/home/bento-gallery.tsx +52 -0
- package/template/src/components/home/contact-section.tsx +34 -0
- package/template/src/components/home/craft-card.tsx +18 -0
- package/template/src/components/home/featured-projects.tsx +186 -0
- package/template/src/components/home/focus-card.tsx +171 -0
- package/template/src/components/home/identity-card.tsx +45 -0
- package/template/src/components/home/philosophy-card.tsx +104 -0
- package/template/src/components/home/skills-in-motion.tsx +109 -0
- package/template/src/components/home/tech-stack-marquee.tsx +56 -0
- package/template/src/components/ui/3d-folder.tsx +569 -0
- package/template/src/components/ui/avatar.tsx +50 -0
- package/template/src/components/ui/badge.tsx +36 -0
- package/template/src/components/ui/basic-avatar.tsx +12 -0
- package/template/src/components/ui/button.tsx +117 -0
- package/template/src/components/ui/clipboard-secret.tsx +39 -0
- package/template/src/components/ui/command-menu.tsx +519 -0
- package/template/src/components/ui/command-palette.tsx +152 -0
- package/template/src/components/ui/consciousness-mode.tsx +200 -0
- package/template/src/components/ui/copy-code-button.tsx +135 -0
- package/template/src/components/ui/display-cards.tsx +70 -0
- package/template/src/components/ui/dotted-map.tsx +128 -0
- package/template/src/components/ui/dropdown-menu.tsx +200 -0
- package/template/src/components/ui/emoji-rating.tsx +123 -0
- package/template/src/components/ui/exit-message.tsx +50 -0
- package/template/src/components/ui/image-zoom-overlay.tsx +178 -0
- package/template/src/components/ui/input-otp.tsx +71 -0
- package/template/src/components/ui/kbd.tsx +87 -0
- package/template/src/components/ui/location-tag.tsx +232 -0
- package/template/src/components/ui/minimal-testimonial.tsx +97 -0
- package/template/src/components/ui/mobile-menu.tsx +191 -0
- package/template/src/components/ui/navbar.tsx +148 -0
- package/template/src/components/ui/page-transition.tsx +24 -0
- package/template/src/components/ui/pixeleted-404-not-found.tsx +110 -0
- package/template/src/components/ui/preloader-wrapper.tsx +102 -0
- package/template/src/components/ui/preloader.tsx +104 -0
- package/template/src/components/ui/project-contributors.tsx +57 -0
- package/template/src/components/ui/scroll-area.tsx +117 -0
- package/template/src/components/ui/signature.tsx +173 -0
- package/template/src/components/ui/smooth-scroll.tsx +31 -0
- package/template/src/components/ui/social-icons.tsx +103 -0
- package/template/src/components/ui/social-stories.tsx +394 -0
- package/template/src/components/ui/sound-constants.ts +1 -0
- package/template/src/components/ui/text-explode.tsx +188 -0
- package/template/src/components/ui/toast.tsx +80 -0
- package/template/src/components/ui/tooltip.tsx +30 -0
- package/template/src/components/ui/user-location.tsx +151 -0
- package/template/src/components/ui/vertical-image-stack.tsx +345 -0
- package/template/src/components/works/changelog-overlay.tsx +212 -0
- package/template/src/components/works/currently-working-card.tsx +130 -0
- package/template/src/components/works/project-details-view.tsx +464 -0
- package/template/src/components/works/project-grid.tsx +81 -0
- package/template/src/fonts/BoliviaSignature-ZpWnz.ttf +0 -0
- package/template/src/fonts/Hendrigo.otf +0 -0
- package/template/src/lib/data.ts +61 -0
- package/template/src/lib/fonts.ts +14 -0
- package/template/src/lib/github.ts +15 -0
- package/template/src/lib/supabase.ts +11 -0
- package/template/src/lib/utils.ts +6 -0
- package/template/tailwind.config.ts +31 -0
- package/template/tsconfig.json +34 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { SiReact, SiNextdotjs, SiTypescript, SiTailwindcss, SiSupabase, SiFigma, SiC, SiCplusplus, SiOpenjdk, SiPython, SiPostgresql, SiDocker, SiGo, SiRust, SiNodedotjs, SiMongodb, SiRedis, SiAmazonwebservices, SiGit, SiPostman, SiGithub, SiServerless } from "react-icons/si";
|
|
4
|
+
|
|
5
|
+
import { useState, useEffect } from "react";
|
|
6
|
+
import { motion } from "framer-motion";
|
|
7
|
+
|
|
8
|
+
export function FocusCard() {
|
|
9
|
+
const [isGolden, setIsGolden] = useState(false);
|
|
10
|
+
const [isHovering, setIsHovering] = useState(false);
|
|
11
|
+
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (isGolden) {
|
|
14
|
+
const timer = setTimeout(() => setIsGolden(false), 5000);
|
|
15
|
+
return () => clearTimeout(timer);
|
|
16
|
+
}
|
|
17
|
+
}, [isGolden]);
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<div
|
|
21
|
+
onDoubleClick={() => setIsGolden(prev => !prev)}
|
|
22
|
+
onMouseDown={(e) => { if (e.detail > 1) e.preventDefault(); }}
|
|
23
|
+
onMouseEnter={() => setIsHovering(true)}
|
|
24
|
+
onMouseLeave={() => setIsHovering(false)}
|
|
25
|
+
className="w-full h-full bg-[#111111] border border-white/5 rounded-[32px] overflow-hidden flex flex-col p-6 sm:p-8 relative group hover:border-white/10 transition-colors cursor-pointer select-none"
|
|
26
|
+
>
|
|
27
|
+
{/* Main Content Layout */}
|
|
28
|
+
<div className="flex flex-row justify-between items-start h-full pt-2">
|
|
29
|
+
{/* Left Column - All technology tags */}
|
|
30
|
+
<div className="flex flex-col gap-6 overflow-y-auto pr-2 pl-2 pb-10 scrollbar-hide mask-image-b w-full relative z-10">
|
|
31
|
+
|
|
32
|
+
{/* Core Stack Section */}
|
|
33
|
+
<div className="flex flex-col gap-3">
|
|
34
|
+
{/* Header: Core Stack (Blue Dot) */}
|
|
35
|
+
<div className="flex items-center gap-3 sticky top-0 bg-[#111111]/95 backdrop-blur-sm py-2 z-20">
|
|
36
|
+
<motion.div
|
|
37
|
+
style={{
|
|
38
|
+
boxShadow: isGolden
|
|
39
|
+
? "0 0 2px rgba(234,179,8,0.8)"
|
|
40
|
+
: "0 0 2px rgba(59,130,246,0.8)"
|
|
41
|
+
}}
|
|
42
|
+
className={`w-1.5 h-1.5 rounded-full ${isGolden ? "bg-yellow-500" : "bg-blue-500"}`}
|
|
43
|
+
/>
|
|
44
|
+
<span className="text-xs font-bold uppercase tracking-widest text-white/40">Core Stack</span>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<div className={`flex items-center gap-4 text-white/50 hover:text-[#61DAFB] transition-all duration-300 group/item pl-1 ${isGolden ? "opacity-100" : "opacity-100"}`}>
|
|
48
|
+
<SiNextdotjs className={`w-4 h-4 sm:w-5 sm:h-5 ${isGolden ? "text-[#61DAFB] drop-shadow-[0_0_5px_rgba(97,218,251,0.5)]" : "text-[#61DAFB]"}`} />
|
|
49
|
+
<span className={`text-[10px] sm:text-xs font-semibold tracking-wide uppercase font-mono ${isGolden ? "text-[#61DAFB] drop-shadow-[0_0_5px_rgba(97,218,251,0.5)]" : ""}`}>Next.js & React</span>
|
|
50
|
+
</div>
|
|
51
|
+
<div className={`flex items-center gap-4 text-white/50 hover:text-[#3178C6] transition-all duration-300 group/item pl-1 ${isGolden ? "opacity-100" : "opacity-100"}`}>
|
|
52
|
+
<div className="flex gap-2">
|
|
53
|
+
<SiNodedotjs className={`w-4 h-4 sm:w-5 sm:h-5 ${isGolden ? "text-[#339933] drop-shadow-[0_0_5px_rgba(51,153,51,0.5)]" : "text-[#339933]"}`} />
|
|
54
|
+
<SiTypescript className={`w-4 h-4 sm:w-5 sm:h-5 ${isGolden ? "text-[#3178C6] drop-shadow-[0_0_5px_rgba(49,120,198,0.5)]" : "text-[#3178C6]"}`} />
|
|
55
|
+
</div>
|
|
56
|
+
<span className="text-[10px] sm:text-xs font-semibold tracking-wide leading-tight uppercase font-mono">
|
|
57
|
+
<span className={isGolden ? "text-[#339933] drop-shadow-[0_0_5px_rgba(51,153,51,0.5)]" : ""}>Node.js</span>
|
|
58
|
+
<span className={isGolden ? "text-white/50" : ""}> & </span>
|
|
59
|
+
<span className={isGolden ? "text-[#3178C6] drop-shadow-[0_0_5px_rgba(49,120,198,0.5)]" : ""}>TS</span>
|
|
60
|
+
</span>
|
|
61
|
+
</div>
|
|
62
|
+
<div className={`flex items-center gap-4 text-white/50 hover:text-[#06B6D4] transition-all duration-300 group/item pl-1 ${isGolden ? "opacity-100" : "opacity-100"}`}>
|
|
63
|
+
<SiTailwindcss className={`w-4 h-4 sm:w-5 sm:h-5 ${isGolden ? "text-[#06B6D4] drop-shadow-[0_0_5px_rgba(6,182,212,0.5)]" : "text-[#06B6D4]"}`} />
|
|
64
|
+
<span className={`text-[10px] sm:text-xs font-semibold tracking-wide uppercase font-mono ${isGolden ? "text-[#06B6D4] drop-shadow-[0_0_5px_rgba(6,182,212,0.5)]" : ""}`}>Tailwind CSS</span>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
{/* Other Stacks Section */}
|
|
69
|
+
<div className="flex flex-col gap-3 mt-2">
|
|
70
|
+
{/* Header: Other Stacks (Red Dot) */}
|
|
71
|
+
<div className="flex items-center gap-3 sticky top-0 bg-[#111111]/95 backdrop-blur-sm py-2 z-20">
|
|
72
|
+
<motion.div
|
|
73
|
+
style={{
|
|
74
|
+
boxShadow: isGolden
|
|
75
|
+
? "0 0 2px rgba(234,179,8,0.8)"
|
|
76
|
+
: "0 0 2px rgba(239,68,68,0.8)"
|
|
77
|
+
}}
|
|
78
|
+
className={`w-1.5 h-1.5 rounded-full ${isGolden ? "bg-yellow-500" : "bg-red-500"}`}
|
|
79
|
+
/>
|
|
80
|
+
<span className="text-xs font-bold uppercase tracking-widest text-white/40">Other Stacks</span>
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
<div className={`flex items-center gap-4 text-white/50 hover:text-[#4169E1] transition-all duration-300 group/item pl-1 ${isGolden ? "opacity-100" : "opacity-100"}`}>
|
|
84
|
+
<div className="flex gap-1.5">
|
|
85
|
+
<SiPostgresql className={`w-4 h-4 ${isGolden ? "text-[#4169E1] opacity-40" : "text-[#4169E1]"}`} />
|
|
86
|
+
<SiPostgresql className={`w-4 h-4 ${isGolden ? "text-[#00E599] scale-125 drop-shadow-[0_0_5px_rgba(0,229,153,0.5)]" : "text-[#00E599]"}`} />
|
|
87
|
+
<SiMongodb className={`w-4 h-4 ${isGolden ? "text-[#47A248] opacity-40" : "text-[#47A248]"}`} />
|
|
88
|
+
</div>
|
|
89
|
+
<span className="text-[10px] sm:text-xs font-semibold tracking-wide leading-tight uppercase font-mono">
|
|
90
|
+
<span className={isGolden ? "opacity-40" : ""}>SQL, </span>
|
|
91
|
+
<span className={isGolden ? "text-[#00E599] drop-shadow-[0_0_5px_rgba(0,229,153,0.5)]" : ""}>Neon</span>
|
|
92
|
+
<span className={isGolden ? "opacity-40" : ""}> & NoSQL</span>
|
|
93
|
+
</span>
|
|
94
|
+
</div>
|
|
95
|
+
<div className={`flex items-center gap-4 text-white/50 hover:text-[#FFD43B] transition-all duration-300 group/item pl-1 ${isGolden ? "opacity-100" : "opacity-100"}`}>
|
|
96
|
+
<SiPython className={`w-4 h-4 sm:w-5 sm:h-5 ${isGolden ? "text-[#3776AB] drop-shadow-[0_0_5px_rgba(55,118,171,0.5)]" : "text-[#3776AB]"}`} />
|
|
97
|
+
<span className={`text-[10px] sm:text-xs font-semibold tracking-wide uppercase font-mono ${isGolden ? "text-[#3776AB] drop-shadow-[0_0_5px_rgba(55,118,171,0.5)]" : ""}`}>Python</span>
|
|
98
|
+
</div>
|
|
99
|
+
<div className={`flex items-center gap-4 text-white/50 hover:text-[#DEA584] transition-all duration-300 group/item pl-1 ${isGolden ? "opacity-20" : "opacity-100"}`}>
|
|
100
|
+
<div className="flex gap-1.5">
|
|
101
|
+
<SiGo className="w-4 h-4 text-[#00ADD8]" />
|
|
102
|
+
<SiRust className="w-4 h-4 text-[#DEA584]" />
|
|
103
|
+
</div>
|
|
104
|
+
<span className="text-[10px] sm:text-xs font-semibold tracking-wide uppercase font-mono">Go / Rust (Allegedly 🤷♂️)</span>
|
|
105
|
+
</div>
|
|
106
|
+
<div className={`flex items-center gap-4 text-white/50 hover:text-[#ED8B00] transition-all duration-300 group/item pl-1 ${isGolden ? "opacity-100" : "opacity-100"}`}>
|
|
107
|
+
<SiOpenjdk className={`w-4 h-4 sm:w-5 sm:h-5 ${isGolden ? "text-[#ED8B00] drop-shadow-[0_0_5px_rgba(237,139,0,0.5)]" : "text-[#ED8B00]"}`} />
|
|
108
|
+
<span className={`text-[10px] sm:text-xs font-semibold tracking-wide uppercase font-mono ${isGolden ? "text-[#ED8B00] drop-shadow-[0_0_5px_rgba(237,139,0,0.5)]" : ""}`}>Java</span>
|
|
109
|
+
</div>
|
|
110
|
+
<div className={`flex items-center gap-4 text-white/50 hover:text-[#00599C] transition-all duration-300 group/item pl-1 ${isGolden ? "opacity-100" : "opacity-100"}`}>
|
|
111
|
+
<div className="flex gap-1.5">
|
|
112
|
+
<SiC className={`w-4 h-4 ${isGolden ? "text-[#A8B9CC] drop-shadow-[0_0_4px_rgba(168,185,204,0.5)]" : "text-[#A8B9CC]"}`} />
|
|
113
|
+
<SiCplusplus className={`w-4 h-4 ${isGolden ? "text-[#00599C] drop-shadow-[0_0_4px_rgba(0,89,156,0.5)]" : "text-[#00599C]"}`} />
|
|
114
|
+
</div>
|
|
115
|
+
<span className="text-[10px] sm:text-xs font-semibold tracking-wide uppercase font-mono">
|
|
116
|
+
<span className={isGolden ? "text-[#A8B9CC] drop-shadow-[0_0_4px_rgba(168,185,204,0.5)]" : ""}>C</span>
|
|
117
|
+
<span className={isGolden ? "text-white/50" : ""}> / </span>
|
|
118
|
+
<span className={isGolden ? "text-[#00599C] drop-shadow-[0_0_4px_rgba(0,89,156,0.5)]" : ""}>C++</span>
|
|
119
|
+
</span>
|
|
120
|
+
</div>
|
|
121
|
+
<div className={`flex items-center gap-4 text-white/50 hover:text-[#2496ED] transition-all duration-300 group/item pl-1 ${isGolden ? "opacity-20" : "opacity-100"}`}>
|
|
122
|
+
<div className="flex gap-1.5">
|
|
123
|
+
<SiDocker className="w-4 h-4 text-[#2496ED]" />
|
|
124
|
+
<SiAmazonwebservices className="w-4 h-4 text-[#FF9900]" />
|
|
125
|
+
</div>
|
|
126
|
+
<span className="text-[10px] sm:text-xs font-semibold tracking-wide uppercase font-mono">Cloud & Docker</span>
|
|
127
|
+
</div>
|
|
128
|
+
<div className={`flex items-center gap-4 text-white/50 hover:text-[#3ECF8E] transition-all duration-300 group/item pl-1 ${isGolden ? "opacity-100" : "opacity-100"}`}>
|
|
129
|
+
<div className="flex gap-1.5">
|
|
130
|
+
<SiSupabase className={`w-4 h-4 ${isGolden ? "text-[#3ECF8E] drop-shadow-[0_0_5px_rgba(62,207,142,0.5)]" : "text-[#3ECF8E]"}`} />
|
|
131
|
+
<SiServerless className={`w-4 h-4 ${isGolden ? "text-[#F5AC1F] drop-shadow-[0_0_5px_rgba(245,172,31,0.5)]" : "text-[#F5AC1F]"}`} />
|
|
132
|
+
</div>
|
|
133
|
+
<span className="text-[10px] sm:text-xs font-semibold tracking-wide uppercase font-mono">
|
|
134
|
+
<span className={isGolden ? "text-[#3ECF8E] drop-shadow-[0_0_5px_rgba(62,207,142,0.5)]" : ""}>Supabase</span>
|
|
135
|
+
<span className={isGolden ? "text-white/50" : ""}> & </span>
|
|
136
|
+
<span className={isGolden ? "text-[#F5AC1F] drop-shadow-[0_0_5px_rgba(245,172,31,0.5)]" : ""}>Convex</span>
|
|
137
|
+
</span>
|
|
138
|
+
</div>
|
|
139
|
+
<div className={`flex items-center gap-4 text-white/50 hover:text-[#F05032] transition-all duration-300 group/item pl-1 ${isGolden ? "opacity-100" : "opacity-100"}`}>
|
|
140
|
+
<div className="flex gap-1.5">
|
|
141
|
+
<SiGit className={`w-4 h-4 ${isGolden ? "text-[#F05032] drop-shadow-[0_0_5px_rgba(240,80,50,0.5)]" : "text-[#F05032]"}`} />
|
|
142
|
+
<SiGithub className={`w-4 h-4 ${isGolden ? "text-white drop-shadow-[0_0_5px_rgba(255,255,255,0.5)]" : "text-white"}`} />
|
|
143
|
+
<SiPostman className={`w-4 h-4 ${isGolden ? "text-[#FF6C37] opacity-40" : "text-[#FF6C37]"}`} />
|
|
144
|
+
</div>
|
|
145
|
+
<span className="text-[10px] sm:text-xs font-semibold tracking-wide leading-tight uppercase font-mono">
|
|
146
|
+
<span className={isGolden ? "text-[#F05032] drop-shadow-[0_0_5px_rgba(240,80,50,0.5)]" : ""}>Git, </span>
|
|
147
|
+
<span className={isGolden ? "text-white drop-shadow-[0_0_5px_rgba(255,255,255,0.5)]" : ""}>GitHub </span>
|
|
148
|
+
<span className={isGolden ? "text-[#777]" : ""}>& </span>
|
|
149
|
+
<span className={isGolden ? "text-white drop-shadow-[0_0_5px_rgba(255,255,255,0.5)]" : ""}>APIs</span>
|
|
150
|
+
</span>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
|
|
155
|
+
{/* Right Area - Large spinning React icon */}
|
|
156
|
+
<div className="flex-shrink-0 pt-4 pr-1 sm:pr-4 absolute right-4 top-12 pointer-events-none z-30">
|
|
157
|
+
<motion.div
|
|
158
|
+
animate={{ rotate: (isHovering || isGolden) ? 360 : 0 }}
|
|
159
|
+
transition={{
|
|
160
|
+
duration: (isHovering || isGolden) ? 8 : 1.5,
|
|
161
|
+
repeat: (isHovering || isGolden) ? Infinity : 0,
|
|
162
|
+
ease: (isHovering || isGolden) ? "linear" : "easeOut"
|
|
163
|
+
}}
|
|
164
|
+
>
|
|
165
|
+
<SiReact className={`w-20 h-20 sm:w-28 sm:h-28 rotate-12 transition-all duration-700 ease-in-out ${isGolden ? "text-[#FFD700] drop-shadow-[0_0_15px_rgba(255,215,0,0.5)] opacity-80" : "text-[#61DAFB]/10 opacity-20 sm:opacity-100 group-hover:text-[#61DAFB]/40 group-hover:drop-shadow-[0_0_15px_rgba(97,218,251,0.3)]"}`} />
|
|
166
|
+
</motion.div>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
);
|
|
171
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import Image from "next/image"
|
|
4
|
+
import Link from "next/link"
|
|
5
|
+
import { motion } from "framer-motion"
|
|
6
|
+
import { LocationTag } from "@/components/ui/location-tag"
|
|
7
|
+
import { UserLocation } from "@/components/ui/user-location"
|
|
8
|
+
|
|
9
|
+
export function IdentityCard() {
|
|
10
|
+
return (
|
|
11
|
+
<div className="relative w-full h-full bg-[#111] rounded-[32px] overflow-hidden group border border-white/5">
|
|
12
|
+
{/* Background Image */}
|
|
13
|
+
<div className="absolute inset-0">
|
|
14
|
+
<Image
|
|
15
|
+
src="https://res.cloudinary.com/dap0u41dz/image/upload/v1766771167/file_00000000d51472078b7e2f9d883a6674_majhmb.jpg"
|
|
16
|
+
alt="Abhishek Singh"
|
|
17
|
+
fill
|
|
18
|
+
priority
|
|
19
|
+
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
|
|
20
|
+
className="object-cover transition-transform duration-700 group-hover:scale-105 opacity-80 group-hover:opacity-60"
|
|
21
|
+
/>
|
|
22
|
+
<div className="absolute inset-0 bg-gradient-to-t from-black via-black/20 to-transparent opacity-90" />
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
{/* Content */}
|
|
26
|
+
<div className="absolute inset-0 flex flex-col justify-end p-8">
|
|
27
|
+
<motion.div
|
|
28
|
+
initial={{ opacity: 0, y: 20 }}
|
|
29
|
+
animate={{ opacity: 1, y: 0 }}
|
|
30
|
+
transition={{ duration: 0.5, delay: 0.2 }}
|
|
31
|
+
>
|
|
32
|
+
<h2 className="text-3xl font-bold text-white mb-2 leading-tight">Abhishek Singh</h2>
|
|
33
|
+
<p className="text-white/60 text-lg font-medium">
|
|
34
|
+
Product Engineer.
|
|
35
|
+
</p>
|
|
36
|
+
|
|
37
|
+
<div className="mt-6 flex items-center justify-between w-full gap-3 flex-wrap">
|
|
38
|
+
<LocationTag className="flex-1 min-w-[140px] !bg-white/10 !backdrop-blur-md !border-white/10" />
|
|
39
|
+
<UserLocation className="flex-1 min-w-[140px] !bg-white/10 !backdrop-blur-md !border-white/10" />
|
|
40
|
+
</div>
|
|
41
|
+
</motion.div>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
)
|
|
45
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { motion } from "framer-motion";
|
|
4
|
+
import { ArrowUpRight } from "lucide-react";
|
|
5
|
+
|
|
6
|
+
export function PhilosophyCard() {
|
|
7
|
+
return (
|
|
8
|
+
<motion.a
|
|
9
|
+
href="/resume.pdf"
|
|
10
|
+
target="_blank"
|
|
11
|
+
rel="noopener noreferrer"
|
|
12
|
+
className="w-full h-full block relative group"
|
|
13
|
+
initial="initial"
|
|
14
|
+
whileHover="hover"
|
|
15
|
+
animate="initial"
|
|
16
|
+
>
|
|
17
|
+
<motion.div
|
|
18
|
+
className="w-full h-full bg-[#1c1c1c] rounded-[32px] p-10 flex flex-col justify-between overflow-hidden border border-white/5 relative z-10"
|
|
19
|
+
variants={{
|
|
20
|
+
initial: {
|
|
21
|
+
y: 0,
|
|
22
|
+
backgroundColor: "rgba(28, 28, 28, 1)",
|
|
23
|
+
borderColor: "rgba(255, 255, 255, 0.05)",
|
|
24
|
+
scale: 1,
|
|
25
|
+
},
|
|
26
|
+
hover: {
|
|
27
|
+
y: -4,
|
|
28
|
+
backgroundColor: "rgba(32, 32, 32, 1)",
|
|
29
|
+
borderColor: "rgba(255, 255, 255, 0.1)",
|
|
30
|
+
scale: 1.01, // Subtle scale up
|
|
31
|
+
transition: {
|
|
32
|
+
duration: 0.4,
|
|
33
|
+
ease: [0.25, 1, 0.5, 1]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}}
|
|
37
|
+
>
|
|
38
|
+
{/* Header Row */}
|
|
39
|
+
<div className="flex items-start justify-between relative z-20">
|
|
40
|
+
<span className="text-xs font-medium uppercase tracking-[0.2em] text-white/30 group-hover:text-white/50 transition-colors duration-300">
|
|
41
|
+
Curriculum Vitae
|
|
42
|
+
</span>
|
|
43
|
+
|
|
44
|
+
<div className="relative w-8 h-8 flex items-center justify-center overflow-hidden">
|
|
45
|
+
<motion.div
|
|
46
|
+
variants={{
|
|
47
|
+
initial: { x: 0, y: 0, opacity: 1 },
|
|
48
|
+
hover: { x: 20, y: -20, opacity: 0 }
|
|
49
|
+
}}
|
|
50
|
+
transition={{ duration: 0.4, ease: "circIn" }}
|
|
51
|
+
className="absolute"
|
|
52
|
+
>
|
|
53
|
+
<ArrowUpRight className="w-5 h-5 text-white/40" />
|
|
54
|
+
</motion.div>
|
|
55
|
+
<motion.div
|
|
56
|
+
variants={{
|
|
57
|
+
initial: { x: -20, y: 20, opacity: 0 },
|
|
58
|
+
hover: { x: 0, y: 0, opacity: 1 }
|
|
59
|
+
}}
|
|
60
|
+
transition={{ duration: 0.4, ease: "circOut", delay: 0.1 }}
|
|
61
|
+
className="absolute"
|
|
62
|
+
>
|
|
63
|
+
<ArrowUpRight className="w-5 h-5 text-white" />
|
|
64
|
+
</motion.div>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
{/* Main Content */}
|
|
69
|
+
<div className="mt-auto space-y-4 relative z-20">
|
|
70
|
+
<motion.h2
|
|
71
|
+
className="text-5xl font-serif font-medium text-white/90 tracking-tight leading-none"
|
|
72
|
+
variants={{
|
|
73
|
+
initial: { x: 0 },
|
|
74
|
+
hover: { x: 4 } // Subtle nudge
|
|
75
|
+
}}
|
|
76
|
+
transition={{ duration: 0.4, ease: [0.25, 1, 0.5, 1] }}
|
|
77
|
+
>
|
|
78
|
+
Resume
|
|
79
|
+
</motion.h2>
|
|
80
|
+
<p className="text-sm text-white/40 leading-relaxed font-light max-w-[90%] group-hover:text-white/60 transition-colors duration-300">
|
|
81
|
+
Selected works, experience, and capabilities.
|
|
82
|
+
</p>
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
{/* Shine Effect */}
|
|
86
|
+
<motion.div
|
|
87
|
+
className="absolute inset-0 z-0 bg-gradient-to-tr from-transparent via-white/[0.03] to-transparent -translate-x-[100%]"
|
|
88
|
+
variants={{
|
|
89
|
+
initial: { x: "-100%" },
|
|
90
|
+
hover: {
|
|
91
|
+
x: "100%",
|
|
92
|
+
transition: {
|
|
93
|
+
duration: 1,
|
|
94
|
+
ease: "easeInOut",
|
|
95
|
+
repeat: Infinity,
|
|
96
|
+
repeatDelay: 1
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}}
|
|
100
|
+
/>
|
|
101
|
+
</motion.div>
|
|
102
|
+
</motion.a>
|
|
103
|
+
)
|
|
104
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { motion } from "framer-motion";
|
|
4
|
+
import { SKILLS, WHY_I_BUILD } from "@/lib/data";
|
|
5
|
+
import { useEffect, useState } from "react";
|
|
6
|
+
import { supabase } from "@/lib/supabase";
|
|
7
|
+
|
|
8
|
+
export function SkillsInMotion() {
|
|
9
|
+
const [skills, setSkills] = useState<string[]>(SKILLS);
|
|
10
|
+
const [profile, setProfile] = useState(WHY_I_BUILD);
|
|
11
|
+
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
async function fetchData() {
|
|
14
|
+
try {
|
|
15
|
+
// Fetch Skills
|
|
16
|
+
const { data: skillsData } = await supabase
|
|
17
|
+
.from('skills')
|
|
18
|
+
.select('name')
|
|
19
|
+
.order('display_order', { ascending: true });
|
|
20
|
+
|
|
21
|
+
if (skillsData && skillsData.length > 0) {
|
|
22
|
+
setSkills(skillsData.map((s: any) => s.name));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Fetch Profile
|
|
26
|
+
const { data: profileData } = await supabase
|
|
27
|
+
.from('profile')
|
|
28
|
+
.select('bio_primary, bio_secondary')
|
|
29
|
+
.limit(1)
|
|
30
|
+
.single();
|
|
31
|
+
|
|
32
|
+
if (profileData) {
|
|
33
|
+
setProfile({
|
|
34
|
+
primary: profileData.bio_primary,
|
|
35
|
+
secondary: profileData.bio_secondary || "",
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
} catch (error) {
|
|
39
|
+
console.error("Error fetching skills/profile:", error);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
fetchData();
|
|
44
|
+
}, []);
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<section id="skills-in-motion" className="py-20">
|
|
48
|
+
<div className="flex items-center justify-between mb-12 px-2">
|
|
49
|
+
{/* Section Header */}
|
|
50
|
+
<h2 className="text-3xl md:text-4xl font-medium text-white/90">
|
|
51
|
+
Thinking + Skills
|
|
52
|
+
</h2>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
56
|
+
|
|
57
|
+
{/* Card 1: Skills in Motion */}
|
|
58
|
+
<motion.div
|
|
59
|
+
initial={{ opacity: 0, x: -20 }}
|
|
60
|
+
whileInView={{ opacity: 1, x: 0 }}
|
|
61
|
+
viewport={{ once: true, margin: "-100px" }}
|
|
62
|
+
transition={{ duration: 0.6 }}
|
|
63
|
+
className="bg-[#111111] border border-white/5 rounded-[32px] p-8 md:p-10 flex flex-col justify-between min-h-[300px]"
|
|
64
|
+
>
|
|
65
|
+
<div>
|
|
66
|
+
<h3 className="text-xl font-medium text-white mb-6">Skills in Motion</h3>
|
|
67
|
+
<ul className="space-y-3">
|
|
68
|
+
{skills.map((skill, index) => (
|
|
69
|
+
<li key={index} className="text-base md:text-lg text-white/60 font-light border-l border-white/10 pl-4 hover:border-white/50 hover:text-white/90 transition-all duration-300">
|
|
70
|
+
{skill}
|
|
71
|
+
</li>
|
|
72
|
+
))}
|
|
73
|
+
</ul>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<div className="mt-8 text-xs text-white/20 uppercase tracking-widest">
|
|
77
|
+
Constantly evolving
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
</motion.div>
|
|
81
|
+
|
|
82
|
+
{/* Card 2: Why I Build */}
|
|
83
|
+
<motion.div
|
|
84
|
+
initial={{ opacity: 0, x: 20 }}
|
|
85
|
+
whileInView={{ opacity: 1, x: 0 }}
|
|
86
|
+
viewport={{ once: true, margin: "-100px" }}
|
|
87
|
+
transition={{ duration: 0.6, delay: 0.2 }}
|
|
88
|
+
className="bg-[#111111] border border-white/5 rounded-[32px] p-8 md:p-10 flex flex-col justify-center relative overflow-hidden group min-h-[300px]"
|
|
89
|
+
>
|
|
90
|
+
{/* Subtle background gradient/glow */}
|
|
91
|
+
<div className="absolute top-0 right-0 w-64 h-64 bg-blue-500/5 rounded-full blur-[80px] -translate-y-1/2 translate-x-1/2 pointer-events-none group-hover:bg-blue-500/10 transition-colors duration-700"></div>
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
<div className="relative z-10">
|
|
95
|
+
<h3 className="text-2xl font-medium text-white mb-8">Why I Build</h3>
|
|
96
|
+
|
|
97
|
+
<p className="text-xl md:text-3xl font-medium text-white leading-tight mb-6">
|
|
98
|
+
"{profile.primary}"
|
|
99
|
+
</p>
|
|
100
|
+
<p className="text-base md:text-lg text-white/50 leading-relaxed max-w-md">
|
|
101
|
+
{profile.secondary}
|
|
102
|
+
</p>
|
|
103
|
+
</div>
|
|
104
|
+
</motion.div>
|
|
105
|
+
|
|
106
|
+
</div>
|
|
107
|
+
</section>
|
|
108
|
+
);
|
|
109
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { motion } from "framer-motion";
|
|
4
|
+
|
|
5
|
+
const TECH_STACK = [
|
|
6
|
+
"C++",
|
|
7
|
+
"Java",
|
|
8
|
+
"HTML",
|
|
9
|
+
"CSS",
|
|
10
|
+
"JavaScript",
|
|
11
|
+
"TypeScript",
|
|
12
|
+
"React",
|
|
13
|
+
"Next.js",
|
|
14
|
+
"Bootstrap",
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
export function TechStackMarquee() {
|
|
18
|
+
return (
|
|
19
|
+
<div className="w-full bg-[#111111] border border-white/5 rounded-[24px] overflow-hidden py-6 relative flex items-center">
|
|
20
|
+
{/* Label */}
|
|
21
|
+
<div className="absolute left-8 z-10 bg-[#111111] pr-6 hidden md:block">
|
|
22
|
+
<div className="flex items-center gap-2">
|
|
23
|
+
<div className="w-2 h-2 rounded-full bg-green-500/80 animate-pulse" />
|
|
24
|
+
<span className="text-sm font-medium text-white/40 uppercase tracking-widest">Technologies</span>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
{/* Gradient Masks */}
|
|
29
|
+
<div className="absolute left-0 top-0 bottom-0 w-32 bg-gradient-to-r from-[#111111] to-transparent z-10 pointer-events-none" />
|
|
30
|
+
<div className="absolute right-0 top-0 bottom-0 w-32 bg-gradient-to-l from-[#111111] to-transparent z-10 pointer-events-none" />
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
{/* Marquee Container */}
|
|
34
|
+
<div className="flex overflow-hidden select-none mask-image:linear-gradient(to right, transparent, black 10%, black 90%, transparent)">
|
|
35
|
+
<motion.div
|
|
36
|
+
animate={{ x: ["0%", "-50%"] }}
|
|
37
|
+
transition={{
|
|
38
|
+
duration: 20,
|
|
39
|
+
ease: "linear",
|
|
40
|
+
repeat: Infinity,
|
|
41
|
+
}}
|
|
42
|
+
className="flex gap-12 flex-shrink-0 items-center pr-12 pl-12 md:pl-48" // Added padding-left for label on desktop
|
|
43
|
+
>
|
|
44
|
+
{[...TECH_STACK, ...TECH_STACK].map((tech, index) => (
|
|
45
|
+
<span
|
|
46
|
+
key={`${tech}-${index}`}
|
|
47
|
+
className="text-xl md:text-2xl font-medium text-white/50 whitespace-nowrap hover:text-white transition-colors cursor-default"
|
|
48
|
+
>
|
|
49
|
+
{tech}
|
|
50
|
+
</span>
|
|
51
|
+
))}
|
|
52
|
+
</motion.div>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
);
|
|
56
|
+
}
|