Merge version_2_1782126024340 into main #1
@@ -5,15 +5,15 @@
|
||||
|
||||
:root {
|
||||
/* @colorThemes/lightTheme/grayNavyBlue */
|
||||
--background: #f5faff;
|
||||
--card: #ffffff;
|
||||
--foreground: #001122;
|
||||
--primary-cta: #15479c;
|
||||
--primary-cta-text: #f5faff;
|
||||
--background: #050505;
|
||||
--card: #0f0f0f;
|
||||
--foreground: #f5f5f5;
|
||||
--primary-cta: #4F8EF7;
|
||||
--primary-cta-text: #ffffff;
|
||||
--secondary-cta: #ffffff;
|
||||
--secondary-cta-text: #001122;
|
||||
--accent: #a8cce8;
|
||||
--background-accent: #7ba3cf;
|
||||
--secondary-cta-text: #050505;
|
||||
--accent: #4F8EF7;
|
||||
--background-accent: #1a1a1a;
|
||||
|
||||
/* @layout/border-radius/rounded */
|
||||
--radius: 1rem;
|
||||
|
||||
@@ -1,181 +1,30 @@
|
||||
import AboutText from '@/components/sections/about/AboutText';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FeaturesTaggedCards from '@/components/sections/features/FeaturesTaggedCards';
|
||||
import HeroBillboardTiltedCarousel from '@/components/sections/hero/HeroBillboardTiltedCarousel';
|
||||
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
|
||||
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
// AUTO-GENERATED shell by per-section-migrate.
|
||||
// Section bodies live in ./<PageBase>/sections/<X>.tsx. Edit the section
|
||||
// files directly. Non-block content (wrappers, non-inlinable sections) is
|
||||
// preserved inline; extracted section blocks become <XSection/> refs.
|
||||
|
||||
export default function HomePage() {
|
||||
import React from 'react';
|
||||
import HeroSection from './HomePage/sections/Hero';
|
||||
import AboutSection from './HomePage/sections/About';
|
||||
import ExperienceSection from './HomePage/sections/Experience';
|
||||
import ProjectsSection from './HomePage/sections/Projects';
|
||||
import SkillsSection from './HomePage/sections/Skills';
|
||||
import ContactSection from './HomePage/sections/Contact';
|
||||
|
||||
export default function HomePage(): React.JSX.Element {
|
||||
return (
|
||||
<>
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroBillboardTiltedCarousel
|
||||
tag="AI/ML Engineer"
|
||||
title="I build intelligent systems."
|
||||
description="Garv. Portfolio showcasing RAG pipelines, multi-agent platforms, and full-stack innovation."
|
||||
primaryButton={{
|
||||
text: "View Projects",
|
||||
href: "#projects",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Get in Touch",
|
||||
href: "#contact",
|
||||
}}
|
||||
items={[
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/3d-abstract-background-with-futuristic-particles_1048-12370.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/3d-low-poly-abstract-background-with-connecting-lines-dots_1048-11673.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/3d-render-abstract-communications-background-with-flowing-cyber-particles_1048-12671.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/optical-fiber-background_23-2149301607.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/illustration-circle-with-abstract-neon-light-effects-great-futuristic-background_181624-26037.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/3d-rendering-abstract-black-white-background_23-2150913805.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<>
|
||||
<HeroSection />
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutText
|
||||
title="I am a Diploma in Information Technology student at R.C. Technical Institute, Ahmedabad, specializing in AI/ML and full-stack development. I build intelligent systems—from RAG pipelines to multi-agent platforms."
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<AboutSection />
|
||||
|
||||
<div id="experience" data-section="experience">
|
||||
<SectionErrorBoundary name="experience">
|
||||
<MetricsFeatureCards
|
||||
tag="Career"
|
||||
title="Professional Experience"
|
||||
description="Building logic and teamwork through internships."
|
||||
metrics={[
|
||||
{
|
||||
value: "60d",
|
||||
title: "React JS Intern",
|
||||
features: [
|
||||
"Problem-solving tasks",
|
||||
"Team adaptability",
|
||||
"Real-time coding",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "15d",
|
||||
title: "Python Intern",
|
||||
features: [
|
||||
"Logic building",
|
||||
"Programming fundamentals",
|
||||
"Project focus",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "2mo",
|
||||
title: "Office Assistant",
|
||||
features: [
|
||||
"Operational support",
|
||||
"Organizational skills",
|
||||
"Time management",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ExperienceSection />
|
||||
|
||||
<div id="projects" data-section="projects">
|
||||
<SectionErrorBoundary name="projects">
|
||||
<FeaturesTaggedCards
|
||||
tag="Projects"
|
||||
title="Featured Works"
|
||||
description="AI-driven solutions and full-stack platforms."
|
||||
items={[
|
||||
{
|
||||
tag: "AI/ML RAG",
|
||||
title: "Video-to-Chatbot",
|
||||
description: "Creates digital twins via Groq, Llama 3, and ChromaDB.",
|
||||
primaryButton: {
|
||||
text: "GitHub",
|
||||
href: "#",
|
||||
},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/financial-program-user-interface-pc-screen-home-office-desk_482257-118861.jpg",
|
||||
},
|
||||
{
|
||||
tag: "Full Stack",
|
||||
title: "Online MUN",
|
||||
description: "Real-time platform with AI scoring and committee judges.",
|
||||
primaryButton: {
|
||||
text: "GitHub",
|
||||
href: "#",
|
||||
},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/team-ambitious-female-leaders-make-decisions-isolated-copy-space_482257-124050.jpg",
|
||||
},
|
||||
{
|
||||
tag: "AI Privacy",
|
||||
title: "Local PDF RAG",
|
||||
description: "Private QA running locally with Ollama and LangChain.",
|
||||
primaryButton: {
|
||||
text: "GitHub",
|
||||
href: "#",
|
||||
},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/hacker-bypasses-network-security-engages-cyber-crime-with-vr-headset_482257-126453.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ProjectsSection />
|
||||
|
||||
<div id="skills" data-section="skills">
|
||||
<SectionErrorBoundary name="skills">
|
||||
<SocialProofMarquee
|
||||
tag="Tech Stack"
|
||||
title="Expertise"
|
||||
names={[
|
||||
"Java",
|
||||
"Python",
|
||||
"React",
|
||||
"FastAPI",
|
||||
"Node.js",
|
||||
"LangChain",
|
||||
"ChromaDB",
|
||||
"Ollama",
|
||||
"Groq",
|
||||
"TypeScript",
|
||||
"Docker",
|
||||
"Git",
|
||||
]}
|
||||
description="The toolset I use to build scalable AI applications."
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<SkillsSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Collaboration"
|
||||
text="Let's Build Something. Open to internships and interesting problems: garv18980@gmail.com | +91-8866264569 | Ahmedabad, India"
|
||||
primaryButton={{
|
||||
text: "LinkedIn",
|
||||
href: "#",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "GitHub",
|
||||
href: "#",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ContactSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
18
src/pages/HomePage/sections/About.tsx
Normal file
18
src/pages/HomePage/sections/About.tsx
Normal file
@@ -0,0 +1,18 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "about" section.
|
||||
|
||||
import React from 'react';
|
||||
import AboutText from '@/components/sections/about/AboutText';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function AboutSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutText
|
||||
title="I am a Diploma in Information Technology student at R.C. Technical Institute, Ahmedabad, specializing in AI/ML and full-stack development. I build intelligent systems—from RAG pipelines to multi-agent platforms."
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
27
src/pages/HomePage/sections/Contact.tsx
Normal file
27
src/pages/HomePage/sections/Contact.tsx
Normal file
@@ -0,0 +1,27 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "contact" section.
|
||||
|
||||
import React from 'react';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function ContactSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Collaboration"
|
||||
text="Let's Build Something. Open to internships and interesting problems: garv18980@gmail.com | +91-8866264569 | Ahmedabad, India"
|
||||
primaryButton={{
|
||||
text: "LinkedIn",
|
||||
href: "#",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "GitHub",
|
||||
href: "#",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
49
src/pages/HomePage/sections/Experience.tsx
Normal file
49
src/pages/HomePage/sections/Experience.tsx
Normal file
@@ -0,0 +1,49 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "experience" section.
|
||||
|
||||
import React from 'react';
|
||||
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function ExperienceSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="experience" data-section="experience">
|
||||
<SectionErrorBoundary name="experience">
|
||||
<MetricsFeatureCards
|
||||
tag="Career"
|
||||
title="Professional Experience"
|
||||
description="Building logic and teamwork through internships."
|
||||
metrics={[
|
||||
{
|
||||
value: "60d",
|
||||
title: "React JS Intern",
|
||||
features: [
|
||||
"Problem-solving tasks",
|
||||
"Team adaptability",
|
||||
"Real-time coding",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "15d",
|
||||
title: "Python Intern",
|
||||
features: [
|
||||
"Logic building",
|
||||
"Programming fundamentals",
|
||||
"Project focus",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "2mo",
|
||||
title: "Office Assistant",
|
||||
features: [
|
||||
"Operational support",
|
||||
"Organizational skills",
|
||||
"Time management",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
173
src/pages/HomePage/sections/Hero.tsx
Normal file
173
src/pages/HomePage/sections/Hero.tsx
Normal file
@@ -0,0 +1,173 @@
|
||||
/* eslint-disable */
|
||||
// @ts-nocheck — generated by catalog-eject; runtime-correct but TS strict-mode false-positives on inlined catalog body
|
||||
import Button from "@/components/ui/Button";
|
||||
import HeroBackgroundSlot from "@/components/ui/HeroBackgroundSlot";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import TiltedCarousel from "@/components/ui/TiltedCarousel";
|
||||
import NoiseBackground from "@/components/ui/NoiseBackground";
|
||||
import FloatingGradientBackground from "@/components/ui/FloatingGradientBackground";
|
||||
import { motion } from "motion/react";
|
||||
import { useState, useEffect } from "react";
|
||||
|
||||
const primaryButton = {
|
||||
text: "View Projects",
|
||||
href: "#projects"
|
||||
};
|
||||
const secondaryButton = {
|
||||
text: "Get in Touch",
|
||||
href: "#contact"
|
||||
};
|
||||
const items = [
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/3d-abstract-background-with-futuristic-particles_1048-12370.jpg"
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/3d-low-poly-abstract-background-with-connecting-lines-dots_1048-11673.jpg"
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/3d-render-abstract-communications-background-with-flowing-cyber-particles_1048-12671.jpg"
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/optical-fiber-background_23-2149301607.jpg"
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/illustration-circle-with-abstract-neon-light-effects-great-futuristic-background_181624-26037.jpg"
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/3d-rendering-abstract-black-white-background_23-2150913805.jpg"
|
||||
}
|
||||
];
|
||||
|
||||
type HeroBillboardTiltedCarouselProps = {
|
||||
tag: string;
|
||||
title: string;
|
||||
description: string;
|
||||
primaryButton: { text: string; href: string };
|
||||
secondaryButton: { text: string; href: string };
|
||||
items: ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never })[];
|
||||
};
|
||||
|
||||
const HeroInline = () => {
|
||||
const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });
|
||||
|
||||
useEffect(() => {
|
||||
const handleMouseMove = (e: MouseEvent) => {
|
||||
setMousePosition({
|
||||
x: (e.clientX / window.innerWidth - 0.5) * 20,
|
||||
y: (e.clientY / window.innerHeight - 0.5) * 20,
|
||||
});
|
||||
};
|
||||
|
||||
window.addEventListener('mousemove', handleMouseMove);
|
||||
return () => window.removeEventListener('mousemove', handleMouseMove);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<section
|
||||
aria-label="Hero section"
|
||||
className="relative flex flex-col items-center justify-center gap-8 md:gap-10 w-full min-h-svh pt-25 pb-20 md:pt-30 overflow-hidden bg-background"
|
||||
>
|
||||
<NoiseBackground position="absolute" />
|
||||
<FloatingGradientBackground position="absolute" />
|
||||
|
||||
{/* Simulated Particle/Wireframe Element */}
|
||||
<motion.div
|
||||
className="absolute inset-0 flex items-center justify-center opacity-30 pointer-events-none"
|
||||
animate={{
|
||||
x: mousePosition.x * -2,
|
||||
y: mousePosition.y * -2,
|
||||
}}
|
||||
transition={{ type: 'spring', stiffness: 50, damping: 20 }}
|
||||
>
|
||||
<div className="w-[600px] h-[600px] rounded-full border-[1px] border-primary-cta/30 border-dashed animate-[spin_60s_linear_infinite]" />
|
||||
<div className="absolute w-[400px] h-[400px] rounded-full border-[1px] border-primary-cta/40 border-dotted animate-[spin_40s_linear_infinite_reverse]" />
|
||||
<div className="absolute w-[800px] h-[800px] rounded-full border-[1px] border-primary-cta/20 animate-[spin_90s_linear_infinite]" />
|
||||
</motion.div>
|
||||
|
||||
<div className="relative z-10 flex flex-col items-center gap-3 w-content-width mx-auto text-center">
|
||||
<motion.div
|
||||
animate={{
|
||||
x: mousePosition.x * 1,
|
||||
y: mousePosition.y * 1,
|
||||
}}
|
||||
transition={{ type: 'spring', stiffness: 75, damping: 15 }}
|
||||
className="px-3 py-1 mb-1 text-sm rounded-full border border-primary-cta/30 bg-primary-cta/10 backdrop-blur-md text-primary-cta font-mono tracking-widest uppercase w-fit inline-flex items-center gap-2"
|
||||
>
|
||||
<span className="w-2 h-2 rounded-full bg-primary-cta animate-pulse" />
|
||||
<p>{"System Online // V.1.0"}</p>
|
||||
</motion.div>
|
||||
|
||||
<motion.div
|
||||
animate={{
|
||||
x: mousePosition.x * 1.5,
|
||||
y: mousePosition.y * 1.5,
|
||||
}}
|
||||
transition={{ type: 'spring', stiffness: 75, damping: 15 }}
|
||||
>
|
||||
<TextAnimation
|
||||
text={"GARV."}
|
||||
variant="fade-blur"
|
||||
gradientText={false}
|
||||
tag="h1"
|
||||
className="md:max-w-8/10 text-7xl 2xl:text-9xl leading-[1.15] font-bold text-center text-balance tracking-tighter"
|
||||
/>
|
||||
<TextAnimation
|
||||
text={"CREATIVE TECHNOLOGY"}
|
||||
variant="slide-up"
|
||||
gradientText={false}
|
||||
tag="h2"
|
||||
className="text-2xl md:text-4xl font-light text-accent tracking-widest mt-2"
|
||||
/>
|
||||
</motion.div>
|
||||
|
||||
<motion.div
|
||||
animate={{
|
||||
x: mousePosition.x * 0.5,
|
||||
y: mousePosition.y * 0.5,
|
||||
}}
|
||||
transition={{ type: 'spring', stiffness: 75, damping: 15 }}
|
||||
>
|
||||
<TextAnimation
|
||||
text={"Immersive, cinematic portfolio showcasing AI/ML projects with a dark, high-tech aesthetic. Building intelligent systems and digital universes."}
|
||||
variant="fade"
|
||||
gradientText={false}
|
||||
tag="p"
|
||||
className="md:max-w-7/10 text-lg md:text-xl leading-snug text-balance text-foreground/70 font-light mt-6"
|
||||
/>
|
||||
</motion.div>
|
||||
|
||||
<motion.div
|
||||
animate={{
|
||||
x: mousePosition.x * 2,
|
||||
y: mousePosition.y * 2,
|
||||
}}
|
||||
transition={{ type: 'spring', stiffness: 75, damping: 15 }}
|
||||
className="flex flex-wrap justify-center gap-3 mt-8 md:mt-10"
|
||||
>
|
||||
<Button text={"Explore Projects"} href={"#projects"} variant="primary" className="rounded-full px-8 py-6 text-lg shadow-[0_0_30px_rgba(79,142,247,0.3)] hover:shadow-[0_0_50px_rgba(79,142,247,0.5)] transition-shadow duration-500" />
|
||||
<Button text={"Initialize Contact"} href={"#contact"} variant="secondary" animationDelay={0.1} className="rounded-full px-8 py-6 text-lg bg-transparent border border-white/20 hover:bg-white/5 backdrop-blur-md" />
|
||||
</motion.div>
|
||||
</div>
|
||||
|
||||
{/* HUD Elements */}
|
||||
<div className="absolute top-8 left-8 text-xs font-mono text-primary-cta/50 hidden md:block z-10">
|
||||
<p>LAT: 34.0522° N</p>
|
||||
<p>LNG: 118.2437° W</p>
|
||||
<p className="mt-2 animate-pulse">REC •</p>
|
||||
</div>
|
||||
<div className="absolute bottom-8 right-8 text-xs font-mono text-primary-cta/50 hidden md:block text-right z-10">
|
||||
<p>SYS.MEM: 64TB</p>
|
||||
<p>NET.UPLINK: ACTIVE</p>
|
||||
<p className="mt-2">v4.0.9</p>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default function HeroSection() {
|
||||
return (
|
||||
<div data-webild-section="hero" id="hero">
|
||||
<HeroInline />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
52
src/pages/HomePage/sections/Projects.tsx
Normal file
52
src/pages/HomePage/sections/Projects.tsx
Normal file
@@ -0,0 +1,52 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "projects" section.
|
||||
|
||||
import React from 'react';
|
||||
import FeaturesTaggedCards from '@/components/sections/features/FeaturesTaggedCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function ProjectsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="projects" data-section="projects">
|
||||
<SectionErrorBoundary name="projects">
|
||||
<FeaturesTaggedCards
|
||||
tag="Projects"
|
||||
title="Featured Works"
|
||||
description="AI-driven solutions and full-stack platforms."
|
||||
items={[
|
||||
{
|
||||
tag: "AI/ML RAG",
|
||||
title: "Video-to-Chatbot",
|
||||
description: "Creates digital twins via Groq, Llama 3, and ChromaDB.",
|
||||
primaryButton: {
|
||||
text: "GitHub",
|
||||
href: "#",
|
||||
},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/financial-program-user-interface-pc-screen-home-office-desk_482257-118861.jpg",
|
||||
},
|
||||
{
|
||||
tag: "Full Stack",
|
||||
title: "Online MUN",
|
||||
description: "Real-time platform with AI scoring and committee judges.",
|
||||
primaryButton: {
|
||||
text: "GitHub",
|
||||
href: "#",
|
||||
},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/team-ambitious-female-leaders-make-decisions-isolated-copy-space_482257-124050.jpg",
|
||||
},
|
||||
{
|
||||
tag: "AI Privacy",
|
||||
title: "Local PDF RAG",
|
||||
description: "Private QA running locally with Ollama and LangChain.",
|
||||
primaryButton: {
|
||||
text: "GitHub",
|
||||
href: "#",
|
||||
},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/hacker-bypasses-network-security-engages-cyber-crime-with-vr-headset_482257-126453.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
34
src/pages/HomePage/sections/Skills.tsx
Normal file
34
src/pages/HomePage/sections/Skills.tsx
Normal file
@@ -0,0 +1,34 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "skills" section.
|
||||
|
||||
import React from 'react';
|
||||
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function SkillsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="skills" data-section="skills">
|
||||
<SectionErrorBoundary name="skills">
|
||||
<SocialProofMarquee
|
||||
tag="Tech Stack"
|
||||
title="Expertise"
|
||||
names={[
|
||||
"Java",
|
||||
"Python",
|
||||
"React",
|
||||
"FastAPI",
|
||||
"Node.js",
|
||||
"LangChain",
|
||||
"ChromaDB",
|
||||
"Ollama",
|
||||
"Groq",
|
||||
"TypeScript",
|
||||
"Docker",
|
||||
"Git",
|
||||
]}
|
||||
description="The toolset I use to build scalable AI applications."
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user