Update page.tsx
This commit is contained in:
+640
-214
@@ -1,235 +1,661 @@
|
|||||||
"use client";
|
import React, { useState, useEffect } from 'react';
|
||||||
import Link from "next/link"
|
import { Github, Linkedin, Mail, ExternalLink, ChevronDown, Code, Database, BarChart3, Globe, Award, GraduationCap, Image, ExternalLink as LinkIcon } from 'lucide-react';
|
||||||
import { Button } from "@/components/ui/button"
|
|
||||||
import {JSX, SVGProps, useState} from "react"
|
|
||||||
import { Card, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
|
|
||||||
import { Badge } from "@/components/ui/badge"
|
|
||||||
import Image from "next/image"
|
|
||||||
import {Github, Linkedin, MenuIcon} from "lucide-react";
|
|
||||||
export default function Home() {
|
|
||||||
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
|
|
||||||
const skills = [
|
|
||||||
"IT Support", "Data Analysis", "Python", "R", "SQL", "Network Architecture",
|
|
||||||
"Network Security", "Cloud Computing", "Data Visualization", "Machine Learning",
|
|
||||||
"Statistical Analysis", "Database Management", "Linux", "Git", "Agile Methodologies",
|
|
||||||
"Project Management", "Business Analysis", "Critical Thinking"
|
|
||||||
];
|
|
||||||
|
|
||||||
const certifications = [
|
const Portfolio = () => {
|
||||||
|
const [activeSection, setActiveSection] = useState('home');
|
||||||
|
const [scrolled, setScrolled] = useState(false);
|
||||||
|
const [showProjectGallery, setShowProjectGallery] = useState(false);
|
||||||
|
|
||||||
|
// Nord Color Palette
|
||||||
|
const nordColors = {
|
||||||
|
bg: '#2E3440',
|
||||||
|
bgLight: '#3B4252',
|
||||||
|
bgLighter: '#434C5E',
|
||||||
|
bgLightest: '#4C566A',
|
||||||
|
text: '#D8DEE9',
|
||||||
|
textMuted: 'rgba(216, 222, 233, 0.6)',
|
||||||
|
accent: '#88C0D0',
|
||||||
|
blue: '#81A1C1',
|
||||||
|
darkBlue: '#5E81AC',
|
||||||
|
cyan: '#8FBCBB',
|
||||||
|
green: '#A3BE8C',
|
||||||
|
yellow: '#EBCB8B',
|
||||||
|
orange: '#D08770',
|
||||||
|
red: '#BF616A',
|
||||||
|
purple: '#B48EAD'
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const handleScroll = () => {
|
||||||
|
setScrolled(window.scrollY > 50);
|
||||||
|
};
|
||||||
|
window.addEventListener('scroll', handleScroll);
|
||||||
|
return () => window.removeEventListener('scroll', handleScroll);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const skills = {
|
||||||
|
'Data & Analytics': ['Python', 'R', 'SQL', 'Statistical Analysis', 'Data Visualization', 'Business Intelligence'],
|
||||||
|
'Web Development': ['JavaScript', 'TypeScript', 'React', 'Next.js', 'HTML5', 'CSS3', 'Tailwind CSS'],
|
||||||
|
'Backend & Tools': ['Flask', 'Express', 'MongoDB', 'SQLite', 'Git', 'Linux'],
|
||||||
|
'Other': ['Java', 'LaTeX', 'Project Planning', 'Financial Analysis']
|
||||||
|
};
|
||||||
|
|
||||||
|
const projects = [
|
||||||
{
|
{
|
||||||
name: "Google IT Support Professional Certificate",
|
title: 'Valgo - Algorithm Visualizer',
|
||||||
issuer: "Google",
|
period: 'Jun 2024 - Present',
|
||||||
image: "./certificates/Coursera_RZ1V4RU6JP2D.png"
|
description: 'Interactive web application designed to help users understand and visualize various sorting algorithms. Built with Next.js and React to make learning algorithms more engaging and intuitive.',
|
||||||
|
tech: ['Next.js', 'React', 'JavaScript', 'Algorithm Visualization'],
|
||||||
|
icon: <Code className="w-6 h-6" />,
|
||||||
|
status: 'Live',
|
||||||
|
images: [
|
||||||
|
'https://via.placeholder.com/600x400/81A1C1/2E3440?text=Algorithm+Visualizer',
|
||||||
|
'https://via.placeholder.com/600x400/88C0D0/2E3440?text=Sorting+Demo',
|
||||||
|
'https://via.placeholder.com/600x400/5E81AC/2E3440?text=Interactive+UI'
|
||||||
|
],
|
||||||
|
features: ['Real-time algorithm visualization', 'Multiple sorting algorithms', 'Step-by-step breakdown', 'Performance comparison'],
|
||||||
|
github: 'https://github.com/Quinta0/valgo',
|
||||||
|
demo: 'https://valgo-demo.vercel.app'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Google Data Analytics Professional Certificate",
|
title: 'Boston Housing Price Prediction',
|
||||||
issuer: "Google",
|
period: 'May 2024 - Present',
|
||||||
image: "./certificates/Coursera_EN181NFH7VYT.png"
|
description: 'Machine learning model to predict housing prices in the Boston area based on various features such as crime rate, average number of rooms per dwelling, and accessibility to radial highways.',
|
||||||
|
tech: ['Python', 'Machine Learning', 'Data Analysis', 'Statistical Modeling'],
|
||||||
|
icon: <BarChart3 className="w-6 h-6" />,
|
||||||
|
status: 'In Progress',
|
||||||
|
images: [
|
||||||
|
'https://via.placeholder.com/600x400/A3BE8C/2E3440?text=Data+Visualization',
|
||||||
|
'https://via.placeholder.com/600x400/EBCB8B/2E3440?text=ML+Model',
|
||||||
|
'https://via.placeholder.com/600x400/D08770/2E3440?text=Results+Analysis'
|
||||||
|
],
|
||||||
|
features: ['Predictive modeling', 'Feature engineering', 'Data visualization', 'Statistical analysis'],
|
||||||
|
github: 'https://github.com/Quinta0/boston-housing'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "IBM Python for Data Science, AI & Development",
|
title: 'Forest Fire Simulation',
|
||||||
issuer: "IBM",
|
period: 'Mar 2024 - Present',
|
||||||
image: "./certificates/Coursera_QT9WT5VCHJNU.png"
|
description: 'Probability & Statistics course project modeling the spread of forest fires over a grid. Accounts for vegetation types, terrain elevation, wind patterns, humidity levels, and spontaneous ignition.',
|
||||||
|
tech: ['Python', 'Statistical Modeling', 'Simulation', 'Data Science'],
|
||||||
|
icon: <Database className="w-6 h-6" />,
|
||||||
|
status: 'Academic Project',
|
||||||
|
images: [
|
||||||
|
'https://via.placeholder.com/600x400/BF616A/2E3440?text=Fire+Simulation',
|
||||||
|
'https://via.placeholder.com/600x400/B48EAD/2E3440?text=Statistical+Model',
|
||||||
|
'https://via.placeholder.com/600x400/8FBCBB/2E3440?text=Data+Analysis'
|
||||||
|
],
|
||||||
|
features: ['Monte Carlo simulation', 'Environmental factors modeling', 'Statistical analysis', 'Visualization tools'],
|
||||||
|
github: 'https://github.com/Quinta0/forest-fire-sim'
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
return (
|
|
||||||
<div className="bg-[#00004d] text-white font-['Segoe UI', 'FiraCode'] min-h-screen">
|
|
||||||
<header className="py-4 px-6 flex items-center justify-between border-b border-[#4d4dff]">
|
|
||||||
<div className="flex items-center gap-4">
|
|
||||||
<TerminalIcon className="w-8 h-8" aria-hidden="true" />
|
|
||||||
<h1 className="text-2xl font-semibold">Pietro Quintavalle</h1>
|
|
||||||
</div>
|
|
||||||
<nav className="hidden md:flex items-center gap-6">
|
|
||||||
{["About", "Skills", "Portfolio", "Certifications"].map((item) => (
|
|
||||||
<Link key={item} href={`#${item.toLowerCase()}`} className="hover:text-[#4d4dff] transition-colors p-2">
|
|
||||||
{item}
|
|
||||||
</Link>
|
|
||||||
))}
|
|
||||||
</nav>
|
|
||||||
<button
|
|
||||||
className="md:hidden text-white p-2"
|
|
||||||
onClick={() => setMobileMenuOpen(!mobileMenuOpen)}
|
|
||||||
aria-label={mobileMenuOpen ? "Close menu" : "Open menu"}
|
|
||||||
>
|
|
||||||
<MenuIcon className="h-6 w-6" aria-hidden="true" />
|
|
||||||
</button>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{/* Mobile menu */}
|
const education = [
|
||||||
{mobileMenuOpen && (
|
{
|
||||||
<div className="md:hidden bg-[#0000b3] py-2">
|
institution: 'USI Università della Svizzera italiana',
|
||||||
{["About", "Skills", "Certifications", "Portfolio"].map((item) => (
|
degree: "Bachelor's degree Economics",
|
||||||
<Link
|
period: 'Sep 2024 - Jun 2027',
|
||||||
key={item}
|
status: 'Current'
|
||||||
href={`#${item.toLowerCase()}`}
|
},
|
||||||
className="block py-2 px-4 text-white hover:bg-[#4d4dff] transition-colors"
|
{
|
||||||
onClick={() => setMobileMenuOpen(false)}
|
institution: 'USI Università della Svizzera italiana',
|
||||||
>
|
degree: 'Bachelor of Science - BS Informatics',
|
||||||
{item}
|
period: 'Jan 2022 - Jan 2024',
|
||||||
</Link>
|
status: 'Completed'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
institution: 'Scuola cantonale di commercio',
|
||||||
|
degree: 'Maturità Cantonale e AFC Economics',
|
||||||
|
period: 'Sep 2017 - Jun 2021',
|
||||||
|
status: 'GPA: 4.5/5'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const certificates = [
|
||||||
|
'Google Data Analytics Professional Certificate',
|
||||||
|
'Google IT Support Professional Certificate',
|
||||||
|
'IT Security: Defense against the digital dark arts',
|
||||||
|
'Python for Data Science, AI & Development'
|
||||||
|
];
|
||||||
|
|
||||||
|
const scrollToSection = (sectionId) => {
|
||||||
|
document.getElementById(sectionId)?.scrollIntoView({ behavior: 'smooth' });
|
||||||
|
setActiveSection(sectionId);
|
||||||
|
};
|
||||||
|
|
||||||
|
const ProjectGallery = ({ project, onClose }) => (
|
||||||
|
<div
|
||||||
|
className="fixed inset-0 z-50 flex items-center justify-center p-4"
|
||||||
|
style={{ backgroundColor: 'rgba(46, 52, 64, 0.95)' }}
|
||||||
|
onClick={onClose}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className="max-w-4xl w-full max-h-[90vh] overflow-y-auto rounded-lg"
|
||||||
|
style={{ backgroundColor: nordColors.bgLight }}
|
||||||
|
onClick={(e) => e.stopPropagation()}
|
||||||
|
>
|
||||||
|
<div className="p-6">
|
||||||
|
<div className="flex justify-between items-start mb-6">
|
||||||
|
<div>
|
||||||
|
<h3 className="text-2xl font-bold mb-2" style={{ color: nordColors.text }}>
|
||||||
|
{project.title}
|
||||||
|
</h3>
|
||||||
|
<div className="flex items-center gap-4">
|
||||||
|
<span className="text-sm" style={{ color: nordColors.blue }}>
|
||||||
|
{project.period}
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
className="px-3 py-1 rounded-full text-xs"
|
||||||
|
style={{
|
||||||
|
backgroundColor: nordColors.darkBlue,
|
||||||
|
color: nordColors.text
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{project.status}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
onClick={onClose}
|
||||||
|
className="text-2xl hover:opacity-70"
|
||||||
|
style={{ color: nordColors.textMuted }}
|
||||||
|
>
|
||||||
|
×
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Project Images */}
|
||||||
|
<div className="grid md:grid-cols-2 gap-4 mb-6">
|
||||||
|
{project.images.map((image, idx) => (
|
||||||
|
<div key={idx} className="aspect-video rounded-lg overflow-hidden">
|
||||||
|
<img
|
||||||
|
src={image}
|
||||||
|
alt={`${project.title} screenshot ${idx + 1}`}
|
||||||
|
className="w-full h-full object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Description */}
|
||||||
|
<div className="mb-6">
|
||||||
|
<h4 className="text-lg font-semibold mb-3" style={{ color: nordColors.blue }}>
|
||||||
|
About This Project
|
||||||
|
</h4>
|
||||||
|
<p className="leading-relaxed" style={{ color: nordColors.textMuted }}>
|
||||||
|
{project.description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Features */}
|
||||||
|
<div className="mb-6">
|
||||||
|
<h4 className="text-lg font-semibold mb-3" style={{ color: nordColors.blue }}>
|
||||||
|
Key Features
|
||||||
|
</h4>
|
||||||
|
<div className="grid md:grid-cols-2 gap-2">
|
||||||
|
{project.features.map((feature, idx) => (
|
||||||
|
<div key={idx} className="flex items-center">
|
||||||
|
<div
|
||||||
|
className="w-2 h-2 rounded-full mr-3"
|
||||||
|
style={{ backgroundColor: nordColors.accent }}
|
||||||
|
></div>
|
||||||
|
<span style={{ color: nordColors.text }}>{feature}</span>
|
||||||
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
)}
|
</div>
|
||||||
<main className="px-6 py-12">
|
|
||||||
<section id="about" className="mb-12">
|
{/* Tech Stack */}
|
||||||
<h2 className="text-3xl font-semibold mb-4">About Me</h2>
|
<div className="mb-6">
|
||||||
<div className="prose prose-invert max-w-3xl">
|
<h4 className="text-lg font-semibold mb-3" style={{ color: nordColors.blue }}>
|
||||||
<p>
|
Technology Stack
|
||||||
Hello! I'm Pietro Quintavalle, a dedicated IT hobbyist with a strong foundation in IT support and
|
</h4>
|
||||||
data analytics who's currently pursuing a bachelor in Economics.
|
<div className="flex flex-wrap gap-2">
|
||||||
My passion lies in leveraging technology to solve complex problems and derive meaningful insights from
|
{project.tech.map((tech) => (
|
||||||
data.
|
<span
|
||||||
With a combination of technical skills and analytical thinking, I'm equipped to tackle challenges
|
key={tech}
|
||||||
in both IT infrastructure and data-driven decision-making.
|
className="px-3 py-1 rounded text-sm"
|
||||||
|
style={{
|
||||||
|
backgroundColor: nordColors.bg,
|
||||||
|
color: nordColors.accent
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{tech}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Links */}
|
||||||
|
<div className="flex gap-4">
|
||||||
|
{project.github && (
|
||||||
|
<a
|
||||||
|
href={project.github}
|
||||||
|
className="flex items-center gap-2 px-4 py-2 rounded hover:opacity-80 transition-opacity"
|
||||||
|
style={{ backgroundColor: nordColors.bgLighter, color: nordColors.text }}
|
||||||
|
>
|
||||||
|
<Github className="w-4 h-4" />
|
||||||
|
View Code
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
|
{project.demo && (
|
||||||
|
<a
|
||||||
|
href={project.demo}
|
||||||
|
className="flex items-center gap-2 px-4 py-2 rounded hover:opacity-80 transition-opacity"
|
||||||
|
style={{ backgroundColor: nordColors.darkBlue, color: nordColors.text }}
|
||||||
|
>
|
||||||
|
<LinkIcon className="w-4 h-4" />
|
||||||
|
Live Demo
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="min-h-screen font-sans" style={{ backgroundColor: nordColors.bg, color: nordColors.text }}>
|
||||||
|
{/* Navigation */}
|
||||||
|
<nav
|
||||||
|
className="fixed top-0 w-full z-40 transition-all duration-300"
|
||||||
|
style={{
|
||||||
|
backgroundColor: scrolled ? 'rgba(46, 52, 64, 0.95)' : 'transparent',
|
||||||
|
borderBottom: scrolled ? `1px solid ${nordColors.bgLight}` : 'none',
|
||||||
|
backdropFilter: scrolled ? 'blur(10px)' : 'none'
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div className="max-w-6xl mx-auto px-6 py-4">
|
||||||
|
<div className="flex justify-between items-center">
|
||||||
|
<div className="text-xl font-bold" style={{ color: nordColors.accent }}>
|
||||||
|
Pietro Quintavalle
|
||||||
|
</div>
|
||||||
|
<div className="hidden md:flex space-x-8">
|
||||||
|
{['Home', 'About', 'Projects', 'Education', 'Contact'].map((item) => (
|
||||||
|
<button
|
||||||
|
key={item}
|
||||||
|
onClick={() => scrollToSection(item.toLowerCase())}
|
||||||
|
className="transition-colors hover:opacity-80"
|
||||||
|
style={{
|
||||||
|
color: activeSection === item.toLowerCase() ? nordColors.accent : nordColors.text
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{item}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
{/* Hero Section */}
|
||||||
|
<section id="home" className="min-h-screen flex items-center justify-center relative">
|
||||||
|
<div className="text-center max-w-4xl mx-auto px-6">
|
||||||
|
<div className="mb-8">
|
||||||
|
<h1 className="text-5xl md:text-7xl font-bold mb-4">
|
||||||
|
<span style={{ color: nordColors.text }}>Pietro</span>
|
||||||
|
<span className="ml-4" style={{ color: nordColors.accent }}>Quintavalle</span>
|
||||||
|
</h1>
|
||||||
|
<div className="text-xl md:text-2xl mb-6" style={{ color: nordColors.blue }}>
|
||||||
|
Economics Student • Data Analytics • Web Development
|
||||||
|
</div>
|
||||||
|
<p className="text-lg max-w-2xl mx-auto leading-relaxed" style={{ color: nordColors.textMuted }}>
|
||||||
|
Passionate about the intersection of economics and technology, exploring how data and code can solve real-world problems.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex justify-center space-x-6 mb-12">
|
||||||
|
<a
|
||||||
|
href="https://github.com/Quinta0"
|
||||||
|
className="p-3 rounded-full transition-colors hover:opacity-80"
|
||||||
|
style={{ backgroundColor: nordColors.bgLight }}
|
||||||
|
>
|
||||||
|
<Github className="w-6 h-6" style={{ color: nordColors.text }} />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://www.linkedin.com/in/pietro-quintavalle-996b96267/"
|
||||||
|
className="p-3 rounded-full transition-colors hover:opacity-80"
|
||||||
|
style={{ backgroundColor: nordColors.bgLight }}
|
||||||
|
>
|
||||||
|
<Linkedin className="w-6 h-6" style={{ color: nordColors.text }} />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="mailto:0pietroquintavalle0@gmail.com"
|
||||||
|
className="p-3 rounded-full transition-colors hover:opacity-80"
|
||||||
|
style={{ backgroundColor: nordColors.bgLight }}
|
||||||
|
>
|
||||||
|
<Mail className="w-6 h-6" style={{ color: nordColors.text }} />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://quinta0.github.io/whoami/"
|
||||||
|
className="p-3 rounded-full transition-colors hover:opacity-80"
|
||||||
|
style={{ backgroundColor: nordColors.bgLight }}
|
||||||
|
>
|
||||||
|
<Globe className="w-6 h-6" style={{ color: nordColors.text }} />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="absolute bottom-8 left-1/2 transform -translate-x-1/2 animate-bounce">
|
||||||
|
<ChevronDown className="w-6 h-6" style={{ color: nordColors.blue }} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* About Section */}
|
||||||
|
<section id="about" className="py-20" style={{ backgroundColor: 'rgba(59, 66, 82, 0.3)' }}>
|
||||||
|
<div className="max-w-6xl mx-auto px-6">
|
||||||
|
<h2 className="text-4xl font-bold text-center mb-16" style={{ color: nordColors.accent }}>
|
||||||
|
About Me
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<div className="grid md:grid-cols-2 gap-12 items-center">
|
||||||
|
<div>
|
||||||
|
<p className="text-lg leading-relaxed mb-6" style={{ color: nordColors.text }}>
|
||||||
|
I'm an Economics student at USI with extensive experience in data analytics and web development.
|
||||||
|
My journey combines analytical thinking with technical skills to create meaningful solutions.
|
||||||
</p>
|
</p>
|
||||||
|
<p className="text-lg leading-relaxed mb-6" style={{ color: nordColors.text }}>
|
||||||
|
Google-certified in Data Analytics and IT Support, I bring proven expertise in Python, R, SQL,
|
||||||
|
and modern web technologies like Next.js and React.
|
||||||
|
</p>
|
||||||
|
<div className="flex flex-wrap gap-3">
|
||||||
|
<span
|
||||||
|
className="px-3 py-1 rounded-full text-sm"
|
||||||
|
style={{ backgroundColor: nordColors.darkBlue, color: nordColors.text }}
|
||||||
|
>
|
||||||
|
Italian (Native)
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
className="px-3 py-1 rounded-full text-sm"
|
||||||
|
style={{ backgroundColor: nordColors.darkBlue, color: nordColors.text }}
|
||||||
|
>
|
||||||
|
English (C2)
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
className="px-3 py-1 rounded-full text-sm"
|
||||||
|
style={{ backgroundColor: nordColors.darkBlue, color: nordColors.text }}
|
||||||
|
>
|
||||||
|
Switzerland 🇨🇭
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex space-x-4 mt-4">
|
|
||||||
<Link href="https://github.com/Quinta0" passHref>
|
<div className="space-y-6">
|
||||||
<a aria-label="GitHub Profile">
|
{Object.entries(skills).map(([category, skillList]) => (
|
||||||
<Button variant="outline" size="icon" className="p-2">
|
<div
|
||||||
<Github className="h-6 w-6" aria-hidden="true"/>
|
key={category}
|
||||||
</Button>
|
className="p-6 rounded-lg border"
|
||||||
</a>
|
style={{
|
||||||
</Link>
|
backgroundColor: nordColors.bg,
|
||||||
<Link href="https://linkedin.com/in/pietro-quintavalle-996b96267" passHref>
|
borderColor: nordColors.bgLight
|
||||||
<a aria-label="LinkedIn Profile">
|
}}
|
||||||
<Button variant="outline" size="icon" className="p-2">
|
>
|
||||||
<Linkedin className="h-6 w-6" aria-hidden="true"/>
|
<h3 className="text-xl font-semibold mb-3" style={{ color: nordColors.blue }}>
|
||||||
</Button>
|
{category}
|
||||||
</a>
|
</h3>
|
||||||
</Link>
|
<div className="flex flex-wrap gap-2">
|
||||||
|
{skillList.map((skill) => (
|
||||||
|
<span
|
||||||
|
key={skill}
|
||||||
|
className="px-3 py-1 rounded text-sm"
|
||||||
|
style={{
|
||||||
|
backgroundColor: nordColors.bgLighter,
|
||||||
|
color: nordColors.text
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{skill}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</div>
|
||||||
<section id="skills" className="mb-16">
|
</div>
|
||||||
<h2 className="text-3xl font-bold mb-4">Skills</h2>
|
</section>
|
||||||
<div className="relative overflow-hidden h-16">
|
|
||||||
<div className="absolute flex animate-marquee">
|
{/* Projects Section */}
|
||||||
{[...skills, ...skills].map((skill, index) => (
|
<section id="projects" className="py-20">
|
||||||
<Badge key={index} variant="secondary" className="mx-2 text-md text-center py-1 px-3">
|
<div className="max-w-6xl mx-auto px-6">
|
||||||
{skill}
|
<h2 className="text-4xl font-bold text-center mb-16" style={{ color: nordColors.accent }}>
|
||||||
</Badge>
|
Featured Projects
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||||
|
{projects.map((project, index) => (
|
||||||
|
<div
|
||||||
|
key={index}
|
||||||
|
className="p-6 rounded-lg border transition-colors hover:opacity-90 cursor-pointer"
|
||||||
|
style={{
|
||||||
|
backgroundColor: nordColors.bgLight,
|
||||||
|
borderColor: nordColors.bgLighter
|
||||||
|
}}
|
||||||
|
onClick={() => setShowProjectGallery(project)}
|
||||||
|
>
|
||||||
|
<div className="flex items-center mb-4">
|
||||||
|
<div
|
||||||
|
className="p-2 rounded-lg mr-3"
|
||||||
|
style={{ backgroundColor: nordColors.darkBlue }}
|
||||||
|
>
|
||||||
|
{project.icon}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h3 className="text-xl font-semibold" style={{ color: nordColors.text }}>
|
||||||
|
{project.title}
|
||||||
|
</h3>
|
||||||
|
<p className="text-sm" style={{ color: nordColors.blue }}>
|
||||||
|
{project.period}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p className="leading-relaxed mb-4" style={{ color: nordColors.textMuted }}>
|
||||||
|
{project.description}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div className="flex flex-wrap gap-2 mb-4">
|
||||||
|
{project.tech.map((tech) => (
|
||||||
|
<span
|
||||||
|
key={tech}
|
||||||
|
className="px-2 py-1 rounded text-xs"
|
||||||
|
style={{
|
||||||
|
backgroundColor: nordColors.bg,
|
||||||
|
color: nordColors.accent
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{tech}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<span
|
||||||
|
className="text-sm flex items-center gap-2"
|
||||||
|
style={{ color: nordColors.blue }}
|
||||||
|
>
|
||||||
|
<Image className="w-4 h-4" />
|
||||||
|
View Gallery
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
className="px-2 py-1 rounded text-xs"
|
||||||
|
style={{
|
||||||
|
backgroundColor: nordColors.darkBlue,
|
||||||
|
color: nordColors.text
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{project.status}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* Education & Certificates Section */}
|
||||||
|
<section id="education" className="py-20" style={{ backgroundColor: 'rgba(59, 66, 82, 0.3)' }}>
|
||||||
|
<div className="max-w-6xl mx-auto px-6">
|
||||||
|
<h2 className="text-4xl font-bold text-center mb-16" style={{ color: nordColors.accent }}>
|
||||||
|
Education & Certifications
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<div className="grid md:grid-cols-2 gap-12">
|
||||||
|
{/* Education */}
|
||||||
|
<div>
|
||||||
|
<h3 className="text-2xl font-semibold mb-8 flex items-center" style={{ color: nordColors.blue }}>
|
||||||
|
<GraduationCap className="w-6 h-6 mr-2" />
|
||||||
|
Education
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<div className="space-y-6">
|
||||||
|
{education.map((edu, index) => (
|
||||||
|
<div
|
||||||
|
key={index}
|
||||||
|
className="p-6 rounded-lg border"
|
||||||
|
style={{
|
||||||
|
backgroundColor: nordColors.bg,
|
||||||
|
borderColor: nordColors.bgLight
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<h4 className="text-lg font-semibold mb-2" style={{ color: nordColors.text }}>
|
||||||
|
{edu.degree}
|
||||||
|
</h4>
|
||||||
|
<p className="mb-2" style={{ color: nordColors.blue }}>
|
||||||
|
{edu.institution}
|
||||||
|
</p>
|
||||||
|
<div className="flex justify-between items-center">
|
||||||
|
<span className="text-sm" style={{ color: nordColors.textMuted }}>
|
||||||
|
{edu.period}
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
className="px-2 py-1 rounded text-xs"
|
||||||
|
style={{ backgroundColor: nordColors.darkBlue, color: nordColors.text }}
|
||||||
|
>
|
||||||
|
{edu.status}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
|
||||||
<section id="portfolio" className="mb-12">
|
{/* Certificates */}
|
||||||
<h2 className="text-3xl font-semibold mb-4">Portfolio</h2>
|
<div>
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
<h3 className="text-2xl font-semibold mb-8 flex items-center" style={{ color: nordColors.blue }}>
|
||||||
{[
|
<Award className="w-6 h-6 mr-2" />
|
||||||
{
|
Certifications
|
||||||
title: "password-generator",
|
</h3>
|
||||||
description: "A unique and interactive password generator built with Next.js and React. ",
|
|
||||||
technologies: ["Nextjs", "Encryption", "Typescript"],
|
<div className="space-y-4">
|
||||||
githubLink: "https://github.com/Quinta0/password-generator"
|
{certificates.map((cert, index) => (
|
||||||
},
|
<div
|
||||||
{
|
key={index}
|
||||||
title: "Valgo",
|
className="p-4 rounded-lg border flex items-center"
|
||||||
description: "A website for visualizing sorting algorithms for the visual learners out there.",
|
style={{
|
||||||
technologies: ["Typescript", "React", "Algorithms"],
|
backgroundColor: nordColors.bg,
|
||||||
githubLink: "https://github.com/Quinta0/valgo"
|
borderColor: nordColors.bgLight
|
||||||
},
|
}}
|
||||||
{
|
>
|
||||||
title: "Gravity",
|
<div
|
||||||
description: "3D Gravity Simulator is a C++ program that visualizes the gravitational interactions between celestial bodies",
|
className="w-2 h-2 rounded-full mr-4"
|
||||||
technologies: ["C++", "OpenGL", "Physics", "3D", "Simulation", "Cmake", "VCPKG"],
|
style={{ backgroundColor: nordColors.accent }}
|
||||||
githubLink: "https://github.com/Quinta0/gravity"
|
></div>
|
||||||
},
|
<span style={{ color: nordColors.text }}>{cert}</span>
|
||||||
{
|
|
||||||
title: "Boston Housing Price Prediction",
|
|
||||||
description: "A simulation of the Boston Housing Price Prediction project that involves building a machine learning model to predict housing prices. ",
|
|
||||||
technologies: ["Python", "Machine Learning", "Data Analysis", "Data Visualization", "Jupyter Notebook", "Probability", "Statistics"],
|
|
||||||
githubLink: "https://github.com/Quinta0/BostonHousing"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Forest Fire Simulation",
|
|
||||||
description: "An assignment for the Probability & Statistics course at USI that aims to model the spread of forest fires over a grid representing a forest landscape.",
|
|
||||||
technologies: ["Statistics", "Python", "Jupyter Notebook", "Simulation", "Probability"],
|
|
||||||
githubLink: "https://github.com/Quinta0/ForestFire"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "AequitasIQ",
|
|
||||||
description: "An intelligent financial analysis tool that creates an interactive dashboard to visualize personal income and expenses.",
|
|
||||||
technologies: ["Python", "Pandas", "LLM", "Ollama", "Plotly", "NumPy", "LangChain"],
|
|
||||||
githubLink: "https://github.com/Quinta0/AequitasIQ-.git"
|
|
||||||
}
|
|
||||||
].map((project, index) => (
|
|
||||||
<div key={index} className="bg-[#0000b3] rounded-md p-4">
|
|
||||||
<h3 className="text-xl font-semibold mb-2">{project.title}</h3>
|
|
||||||
<p className="mb-4">{project.description}</p>
|
|
||||||
<div className="mb-4">
|
|
||||||
{project.technologies.map((tech, techIndex) => (
|
|
||||||
<span key={techIndex}
|
|
||||||
className="inline-block bg-[#4d4dff] text-white rounded-full px-3 py-1 text-sm font-semibold mr-2 mb-2">
|
|
||||||
{tech}
|
|
||||||
</span>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
<div className="flex justify-end">
|
|
||||||
<Link
|
|
||||||
href={project.githubLink}
|
|
||||||
className="inline-flex items-center rounded-md bg-[#4d4dff] px-4 py-2 text-sm font-medium text-white shadow-sm transition-colors hover:bg-[#3b3bd9] focus:outline-none focus:ring-2 focus:ring-[#4d4dff] focus:ring-offset-2"
|
|
||||||
aria-label={`View ${project.title} on GitHub`}
|
|
||||||
>
|
|
||||||
View on GitHub
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className="mt-8 p-6 rounded-lg border"
|
||||||
|
style={{
|
||||||
|
backgroundColor: nordColors.bg,
|
||||||
|
borderColor: nordColors.bgLight
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<h4 className="text-lg font-semibold mb-3" style={{ color: nordColors.blue }}>
|
||||||
|
Interests
|
||||||
|
</h4>
|
||||||
|
<div className="flex flex-wrap gap-2">
|
||||||
|
{['Computer Hardware', 'Web Development', 'Finance', 'Economics', 'Literature'].map((interest) => (
|
||||||
|
<span
|
||||||
|
key={interest}
|
||||||
|
className="px-3 py-1 rounded text-sm"
|
||||||
|
style={{
|
||||||
|
backgroundColor: nordColors.bgLighter,
|
||||||
|
color: nordColors.text
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{interest}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</div>
|
||||||
<section id="certifications" className="mb-16">
|
</div>
|
||||||
<h2 className="text-3xl font-semibold mb-4">Certifications</h2>
|
</section>
|
||||||
<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
|
|
||||||
{certifications.map((cert, index) => (
|
|
||||||
<Card key={index} className="overflow-hidden bg-[#0000b3] text-white">
|
|
||||||
<Image src={cert.image} alt={cert.name} width={400} height={300}
|
|
||||||
className="w-full object-contain"/>
|
|
||||||
<CardHeader>
|
|
||||||
<CardTitle>{cert.name}</CardTitle>
|
|
||||||
<CardDescription className="text-gray-300">{cert.issuer}</CardDescription>
|
|
||||||
</CardHeader>
|
|
||||||
</Card>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</main>
|
|
||||||
<footer className="bg-[#0000b3] py-6 px-6 text-center text-sm">
|
|
||||||
<p>© 2024 Pietro Quintavalle. All rights reserved.</p>
|
|
||||||
</footer>
|
|
||||||
<style jsx>{`
|
|
||||||
@keyframes marquee {
|
|
||||||
0% {
|
|
||||||
transform: translateX(100%);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: translateX(-100%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.animate-marquee {
|
{/* Contact Section */}
|
||||||
animation: marquee 30s linear infinite;
|
<section id="contact" className="py-20">
|
||||||
}
|
<div className="max-w-4xl mx-auto px-6 text-center">
|
||||||
`}</style>
|
<h2 className="text-4xl font-bold mb-8" style={{ color: nordColors.accent }}>
|
||||||
</div>
|
Let's Connect
|
||||||
)
|
</h2>
|
||||||
}
|
<p className="text-lg mb-12 max-w-2xl mx-auto" style={{ color: nordColors.textMuted }}>
|
||||||
|
I'm always interested in discussing new opportunities, collaborations, or just having a chat about technology and economics.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div className="grid md:grid-cols-3 gap-8 mb-12">
|
||||||
|
<a
|
||||||
|
href="mailto:0pietroquintavalle0@gmail.com"
|
||||||
|
className="p-6 rounded-lg transition-colors hover:opacity-80 group"
|
||||||
|
style={{ backgroundColor: nordColors.bgLight }}
|
||||||
|
>
|
||||||
|
<Mail className="w-8 h-8 mx-auto mb-4" style={{ color: nordColors.blue }} />
|
||||||
|
<h3 className="text-lg font-semibold mb-2" style={{ color: nordColors.text }}>Email</h3>
|
||||||
|
<p className="text-sm" style={{ color: nordColors.textMuted }}>Drop me a line</p>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="https://www.linkedin.com/in/pietro-quintavalle-996b96267/"
|
||||||
|
className="p-6 rounded-lg transition-colors hover:opacity-80 group"
|
||||||
|
style={{ backgroundColor: nordColors.bgLight }}
|
||||||
|
>
|
||||||
|
<Linkedin className="w-8 h-8 mx-auto mb-4" style={{ color: nordColors.blue }} />
|
||||||
|
<h3 className="text-lg font-semibold mb-2" style={{ color: nordColors.text }}>LinkedIn</h3>
|
||||||
|
<p className="text-sm" style={{ color: nordColors.textMuted }}>Let's connect professionally</p>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="https://github.com/Quinta0"
|
||||||
|
className="p-6 rounded-lg transition-colors hover:opacity-80 group"
|
||||||
|
style={{ backgroundColor: nordColors.bgLight }}
|
||||||
|
>
|
||||||
|
<Github className="w-8 h-8 mx-auto mb-4" style={{ color: nordColors.blue }} />
|
||||||
|
<h3 className="text-lg font-semibold mb-2" style={{ color: nordColors.text }}>GitHub</h3>
|
||||||
|
<p className="text-sm" style={{ color: nordColors.textMuted }}>Check out my code</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
function TerminalIcon(props: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>) {
|
{/* Footer */}
|
||||||
return (
|
<footer className="py-8 border-t" style={{ borderColor: nordColors.bgLight }}>
|
||||||
<svg
|
<div className="max-w-6xl mx-auto px-6 text-center">
|
||||||
{...props}
|
<p style={{ color: nordColors.textMuted }}>
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
Built with ❄️ using React & Nord theme • Pietro Quintavalle © 2025
|
||||||
width="24"
|
</p>
|
||||||
height="24"
|
</div>
|
||||||
viewBox="0 0 24 24"
|
</footer>
|
||||||
fill="none"
|
|
||||||
stroke="currentColor"
|
{/* Project Gallery Modal */}
|
||||||
strokeWidth="2"
|
{showProjectGallery && (
|
||||||
strokeLinecap="round"
|
<ProjectGallery
|
||||||
strokeLinejoin="round"
|
project={showProjectGallery}
|
||||||
>
|
onClose={() => setShowProjectGallery(false)}
|
||||||
<polyline points="4 17 10 11 4 5"/>
|
/>
|
||||||
<line x1="12" x2="20" y1="19" y2="19"/>
|
)}
|
||||||
</svg>
|
</div>
|
||||||
)
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
export default Portfolio;
|
||||||
|
|||||||
Reference in New Issue
Block a user