diff --git a/app/about/page.tsx b/app/about/page.tsx new file mode 100644 index 0000000..9574a18 --- /dev/null +++ b/app/about/page.tsx @@ -0,0 +1,206 @@ +import Image from "next/image"; +import Chip from "@/components/chip"; +import { Metadata } from "next"; +import { Check } from "lucide-react"; + +export const metadata: Metadata = { + title: "About Me | Gabriel Kaszewski", + description: + "Learn more about Gabriel Kaszewski, his skills, and his journey as a developer.", +}; + +const hobbies = [ + "Programming 💻", + "Filmmaking 🎥", + "Gaming 🕹️", + "Playing guitar 🎸", +]; +const interests = [ + "Computer Science 💾", + "Sci-Fi Books📚", + "Astronomy 🔭", + "Sports 🏅", + "History 🏰", +]; +const futureGoals = [ + "Deepen my expertise in Rust for high-performance applications.", + "Contribute to impactful open-source projects.", + "Develop and release my first full-fledged indie game.", +]; +const faqItems = [ + { + q: "How old were you when you started programming?", + a: "I was 11 years old 🧑‍💻.", + }, + { + q: "How did you learn programming?", + a: "I read books 📖 and practiced a lot.", + }, + { + q: "Are you studying Computer Science?", + a: "No, I have a degree in Bioinformatics, which is a closely related field.", + }, + { + q: "Which programming language do you recommend for a beginner?", + a: "The language doesn't really matter, just choose one you like and dive in 🌊.", + }, + { + q: "What was your first programming language?", + a: "My journey began with C++ 🖥️.", + }, + { + q: "What is your favorite programming language?", + a: "I enjoy writing in C, Rust, and Python 🐍. But Rust is the best 💖🦀", + }, +]; + +const calculateAge = (birthDate: string): number => { + const today = new Date(); + const birth = new Date(birthDate); + let age = today.getFullYear() - birth.getFullYear(); + const monthDifference = today.getMonth() - birth.getMonth(); + if ( + monthDifference < 0 || + (monthDifference === 0 && today.getDate() < birth.getDate()) + ) { + age--; + } + return age; +}; + +const AboutPage = () => { + const age = calculateAge("2002-02-27"); + + return ( +
+
+ A photo of Gabriel Kaszewski +

Hello, I'm Gabriel! 👋

+
+ +
+
+

More info about me! 💡

+

+ Hi! I am Gabriel and I am {age} years old. I graduated in + Bioinformatics from the University of Gdańsk 🏫. I'm fluent in + Polish and English and currently work as a Python Developer at + digimonkeys.com 🐒💻. +

+

+ I have co-authored one scientific article, which you can read{" "} + + here + + . +

+
+ +
+
+

Hobbies 🎮🎸

+
+ {hobbies.map((hobby) => ( + + ))} +
+
+
+

Interests 🌌📚

+
+ {interests.map((interest) => ( + + ))} +
+
+
+ +
+

My Philosophy 🧠

+

+ I believe much of today's software is bloated, inefficient, and + disrespectful of the user's resources. My passion, which + started with a simple curiosity at age 11, is to build a better + alternative. I focus on creating software that is{" "} + + fast, reliable, and genuinely intuitive + + , guided by the principles of clean and efficient code. +

+
+ +
+

My Toolkit 🛠️

+
+
+
+

OS & Hardware

+

+ Arch Linux, Custom-built PC (Ryzen 7 5800X3D, RTX 4070 Ti, + 48GB RAM) +

+
+
+

Editor

+

Jetbrains IDEs (Pycharm, Rider) & VS Code

+
+
+

Primary Languages

+

Rust, Python, C#, TypeScript

+
+
+

Favorite Tech

+

Axum, Godot, React, TailwindCSS

+
+
+
+
+ +
+

Future Goals 🚀

+

+ I'm always eager to learn and grow. My goal is to continue + honing my skills in backend development and system architecture. + Here's what's on my radar: +

+
    + {futureGoals.map((goal) => ( +
  • + + {goal} +
  • + ))} +
+
+ +
+

FAQ ❓

+
+ {faqItems.map((item) => ( +
+

{item.q}

+

{item.a}

+
+ ))} +
+
+
+
+ ); +}; + +export default AboutPage; diff --git a/app/favicon.ico b/app/favicon.ico index 718d6fe..ac27b5f 100644 Binary files a/app/favicon.ico and b/app/favicon.ico differ diff --git a/app/globals.css b/app/globals.css index a2dc41e..02be7db 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,4 +1,6 @@ @import "tailwindcss"; +@plugin "@tailwindcss/typography"; +@plugin "tailwindcss-motion"; :root { --background: #ffffff; @@ -6,10 +8,30 @@ } @theme inline { + --card: hsl(0 0% 100%); + --color-background: var(--background); --color-foreground: var(--foreground); + --color-card: var(--card); --font-sans: var(--font-geist-sans); --font-mono: var(--font-geist-mono); + + --gradient-fa-blue: 135deg, hsl(217 91% 60%) 0%, hsl(200 90% 70%) 100%; + --gradient-fa-green: 135deg, hsl(155 70% 55%) 0%, hsl(170 80% 65%) 100%; + --gradient-fa-card: 180deg, hsl(var(--card)) 0%, hsl(var(--card)) 90%, + hsl(var(--card)) 100%; + --gradient-fa-gloss: 135deg, rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0) 100%; + + --shadow-fa-sm: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06); + --shadow-fa-md: 0 4px 6px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.06); + --shadow-fa-lg: 0 10px 15px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05); + --fa-inner: inset 0 1px 2px rgba(0, 0, 0, 0.1); + + --text-shadow-default: 0 1px 1px rgba(0, 0, 0, 0.2); + --text-shadow-sm: 0 1px 0px rgba(255, 255, 255, 0.4); + --text-shadow-md: 0 2px 2px rgba(0, 0, 0, 0.2); + --text-shadow-lg: 0 4px 4px rgba(0, 0, 0, 0.2); } @media (prefers-color-scheme: dark) { @@ -20,7 +42,149 @@ } body { - background: var(--background); + /* background: var(--background); */ + background-image: url("/images/background.avif"); + background-size: cover; + background-attachment: fixed; + background-position: center; color: var(--foreground); font-family: Arial, Helvetica, sans-serif; } + +@layer base { + glossy-effect::before { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 50%; + border-radius: inherit; + background: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.4) 0%, + rgba(255, 255, 255, 0.1) 100% + ); + opacity: 0.8; + pointer-events: none; + z-index: 1; + } + + .glossy-effect.bottom::after { + content: ""; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 30%; + border-radius: inherit; + background: linear-gradient( + 0deg, + rgba(0, 0, 0, 0.1) 0%, + rgba(0, 0, 0, 0) 100% + ); + pointer-events: none; + z-index: 1; + } + + .fa-gradient-blue { + background: linear-gradient(var(--gradient-fa-blue)); + } + .fa-gradient-green { + background: linear-gradient(var(--gradient-fa-green)); + } + .fa-gradient-card { + background: linear-gradient(var(--gradient-fa-card)); + } + .fa-gloss { + position: relative; + } + .fa-gloss::before { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 50%; + border-radius: inherit; + background: linear-gradient(var(--gradient-fa-gloss)); + opacity: 0.8; + pointer-events: none; + z-index: 1; + } + .fa-gloss.bottom::after { + content: ""; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 30%; + border-radius: inherit; + background: linear-gradient( + 0deg, + rgba(0, 0, 0, 0.1) 0%, + rgba(0, 0, 0, 0) 100% + ); + pointer-events: none; + z-index: 1; + } +} + +@layer components { + .shadow-fa-sm { + box-shadow: var(--shadow-fa-sm), var(--fa-inner); + } + .shadow-fa-md { + box-shadow: var(--shadow-fa-md), var(--fa-inner); + } + .shadow-fa-lg { + box-shadow: var(--shadow-fa-lg), var(--fa-inner); + } + .text-shadow-default { + text-shadow: var(--text-shadow-default); + } + .text-shadow-sm { + text-shadow: var(--text-shadow-sm); + } + .text-shadow-md { + text-shadow: var(--text-shadow-md); + } + .text-shadow-lg { + text-shadow: var(--text-shadow-lg); + } + + .glass-effect { + @apply backdrop-blur-lg border border-white/20 shadow-fa-lg; + } + + .gloss-highlight::before { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 60%; + border-radius: inherit; + background: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.5) 0%, + rgba(255, 255, 255, 0) 100% + ); + pointer-events: none; + z-index: 1; + } +} + +@layer utilities { + .my-animate { + opacity: 1 !important; + transform: translateY(0) !important; + transition: opacity 0.3s ease, transform 0.3s ease; + } + + .hidden-for-animation { + opacity: 0; + transform: translateY(20px); + transition: opacity 0.3s ease, transform 0.3s ease; + } +} diff --git a/app/layout.tsx b/app/layout.tsx index f7fa87e..d560fb2 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,6 +1,9 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; +import Navbar from "@/components/navbar"; +import Footer from "@/components/footer"; +import Image from "next/image"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -13,8 +16,8 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "Gabriel Kaszewski", + description: "Welcome to my portfolio", }; export default function RootLayout({ @@ -25,9 +28,11 @@ export default function RootLayout({ return ( + {children} +