+
{project.link && (
Live
@@ -72,9 +72,11 @@ export const ProjectCard: React.FC = ({ project, index }) => {
{project.github && (
Code
diff --git a/apps/web/src/features/projects/components/ProjectsSection.tsx b/apps/web/src/features/projects/components/ProjectsSection.tsx
index 122ac22..8b8226b 100644
--- a/apps/web/src/features/projects/components/ProjectsSection.tsx
+++ b/apps/web/src/features/projects/components/ProjectsSection.tsx
@@ -5,12 +5,12 @@ import { ProjectCard } from './ProjectCard';
import AnimatedSection from '../../../shared/components/AnimatedSection';
import type { Project } from '../../../shared/types';
-type Category = 'All' | 'Web Apps' | 'UI Components' | 'Full Stack';
+type Category = 'Alle' | 'Webanwendungen' | 'UI-Komponenten' | 'Fullstack';
export const ProjectsSection: React.FC = () => {
- const [selectedCategory, setSelectedCategory] = useState('All');
+ const [selectedCategory, setSelectedCategory] = useState('Alle');
- const categories: Category[] = ['All', 'Web Apps', 'UI Components', 'Full Stack'];
+ const categories: Category[] = ['Alle', 'Webanwendungen', 'UI-Komponenten', 'Fullstack'];
const filteredProjects = projectsData.filter(
(project: Project) =>
@@ -29,14 +29,14 @@ export const ProjectsSection: React.FC = () => {
transition={{ duration: 0.5 }}
className="inline-block px-4 py-2 rounded-full border border-green-500/50 bg-green-500/10 mb-6"
>
- My Work
+ Meine Projekte
- Featured Projects
+ Ausgewählte Projekte
- Showcasing my best work and achievements
+ Eine Auswahl meiner besten Lösungen und Erfolge
diff --git a/apps/web/src/features/projects/data/projectsData.ts b/apps/web/src/features/projects/data/projectsData.ts
index 4b55954..d0d2baa 100644
--- a/apps/web/src/features/projects/data/projectsData.ts
+++ b/apps/web/src/features/projects/data/projectsData.ts
@@ -3,34 +3,34 @@ import type { Project } from '../../../shared/types';
export const projectsData: Project[] = [
{
id: '1',
- title: 'E-Commerce Platform',
+ title: 'Order Flow Microservice Suite',
description:
- 'Full-stack e-commerce platform with product catalog, shopping cart, and payment integration using Stripe',
- image: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=800&h=600&fit=crop',
- tags: ['React', 'Next.js', 'TypeScript', 'Tailwind CSS', 'MongoDB'],
- category: 'Full Stack',
+ 'Skalierbare Auftragsverwaltung mit .NET, SQL, Docker und SQS für robuste, ereignisgesteuerte Commerce-Flows.',
+ image: 'https://images.unsplash.com/photo-1498050108023-c5249f4df085?w=800&h=600&fit=crop',
+ tags: ['.NET', 'Docker', 'SQL', 'SQS', 'Clean Architecture'],
+ category: 'Fullstack',
link: '#',
github: '#',
},
{
id: '2',
- title: 'Task Management Dashboard',
+ title: 'Design System Engine',
description:
- 'A collaborative task management application with real-time updates, user authentication, and advanced filtering',
- image: 'https://images.unsplash.com/photo-1552664730-d307ca884978?w=800&h=600&fit=crop',
- tags: ['React', 'Firebase', 'TypeScript', 'Tailwind CSS'],
- category: 'Web Apps',
+ 'Wiederverwendbares UI-System mit React, Tailwind, Figma-Tokens und Storybook für teamübergreifende Konsistenz.',
+ image: 'https://images.unsplash.com/photo-1519389950473-47ba0277781c?w=800&h=600&fit=crop',
+ tags: ['React', 'Tailwind CSS', 'Figma', 'Storybook'],
+ category: 'UI-Komponenten',
link: '#',
github: '#',
},
{
id: '3',
- title: 'Component Library',
+ title: 'Performance Platform',
description:
- 'A comprehensive reusable component library with Storybook documentation and design system tokens',
- image: 'https://images.unsplash.com/photo-1517694712202-14dd9538aa97?w=800&h=600&fit=crop',
- tags: ['React', 'Storybook', 'Tailwind CSS', 'TypeScript'],
- category: 'UI Components',
+ 'Leistungsstarkes Backend mit Node.js, Fastify, NestJS und Docker, optimiert für schnelle Deployments und Observability.',
+ image: 'https://images.unsplash.com/photo-1504384308090-c894fdcc538d?w=800&h=600&fit=crop',
+ tags: ['Node.js', 'Fastify', 'NestJS', 'Docker', 'Linux'],
+ category: 'Webanwendungen',
link: '#',
github: '#',
},
diff --git a/apps/web/src/features/skills/components/SkillCard.tsx b/apps/web/src/features/skills/components/SkillCard.tsx
index ae9c01f..c93f2ee 100644
--- a/apps/web/src/features/skills/components/SkillCard.tsx
+++ b/apps/web/src/features/skills/components/SkillCard.tsx
@@ -4,7 +4,7 @@ import { iconMap } from '../data/skillsData';
import type { Skill } from '../../../shared/types';
interface SkillCardProps {
- skill: Skill;
+ skill: Skill & { iconName: keyof typeof iconMap };
index: number;
}
@@ -23,44 +23,41 @@ export const SkillCard: React.FC
= ({ skill, index }) => {
Beginner: 'bg-blue-500/20',
};
- // Get icon from the mapped skill name
- const IconComponent = iconMap[skill.name as keyof typeof iconMap];
+ const IconComponent = iconMap[skill.iconName];
return (
-
+
{IconComponent && }
-
+
{skill.level}
-
{skill.name}
+
{skill.name}
- {/* Progress Bar */}
- Proficiency
+ Experience
{skill.years}+ yrs
-
+
diff --git a/apps/web/src/features/skills/components/SkillsSection.tsx b/apps/web/src/features/skills/components/SkillsSection.tsx
index 355b184..834875f 100644
--- a/apps/web/src/features/skills/components/SkillsSection.tsx
+++ b/apps/web/src/features/skills/components/SkillsSection.tsx
@@ -4,12 +4,27 @@ import { skillsData } from '../data/skillsData';
import { SkillCard } from './SkillCard';
import AnimatedSection from '../../../shared/components/AnimatedSection';
-type Category = 'All' | 'Frontend' | 'Backend' | 'Tools' | 'Design';
+type Category =
+ | 'Alle'
+ | 'Frontend'
+ | 'Backend'
+ | 'Tools'
+ | 'Design'
+ | 'Architektur'
+ | 'Kreativ';
export const SkillsSection: React.FC = () => {
- const [selectedCategory, setSelectedCategory] = useState
('All');
+ const [selectedCategory, setSelectedCategory] = useState('Alle');
- const categories: Category[] = ['All', 'Frontend', 'Backend', 'Tools', 'Design'];
+ const categories: Category[] = [
+ 'Alle',
+ 'Frontend',
+ 'Backend',
+ 'Tools',
+ 'Design',
+ 'Architektur',
+ 'Kreativ',
+ ];
const filteredSkills = skillsData.filter(
(skill) => selectedCategory === 'All' || skill.category === selectedCategory
@@ -27,14 +42,14 @@ export const SkillsSection: React.FC = () => {
transition={{ duration: 0.5 }}
className="inline-block px-4 py-2 rounded-full border border-green-500/50 bg-green-500/10 mb-6"
>
- My Expertise
+ Meine Expertise
- Skills & Technologies
+ Fähigkeiten & Technologien
- A comprehensive overview of my technical skills and proficiency levels
+ Ein Überblick über meine technischen Fähigkeiten und Erfahrungsstufen.
diff --git a/apps/web/src/features/skills/data/skillsData.ts b/apps/web/src/features/skills/data/skillsData.ts
index 2044299..8b788ab 100644
--- a/apps/web/src/features/skills/data/skillsData.ts
+++ b/apps/web/src/features/skills/data/skillsData.ts
@@ -6,20 +6,40 @@ import {
GitBranch,
Wind,
Package,
+ PenTool,
+ Layers,
+ Terminal,
+ Box,
+ FileText,
+ Gamepad,
+ ShieldCheck,
} from 'lucide-react';
import type { Skill } from '../../../shared/types';
export const iconMap = {
'React.js': Code,
+ 'Vue.js': Code,
'JavaScript': Zap,
'TypeScript': Code,
- 'Next.js': Package,
- 'Node.js': Database,
- 'REST APIs': Code,
- 'Git & GitHub': GitBranch,
- 'Responsive Design': Layout,
- 'Figma': Wind,
'Tailwind CSS': Wind,
+ 'CSS': Layout,
+ '.NET': ShieldCheck,
+ 'Node.js': Database,
+ 'Express.js': Zap,
+ 'Fastify': Box,
+ 'NestJS': Layers,
+ 'SQL / SQS': Database,
+ 'Git & GitHub': GitBranch,
+ 'Docker': Box,
+ 'Linux': Terminal,
+ 'Clean Architecture': Layers,
+ 'Vertical Slice Architecture': Layers,
+ 'Design Patterns': Layout,
+ 'Figma': PenTool,
+ 'Unity': Gamepad,
+ 'Blender': Package,
+ 'Godot': Package,
+ 'LaTeX': FileText,
};
export const skillsData: Array
& { iconName: keyof typeof iconMap }> = [
@@ -27,70 +47,140 @@ export const skillsData: Array & { iconName: keyof typeof ic
name: 'React.js',
iconName: 'React.js',
level: 'Expert',
- years: 3,
+ years: 4,
category: 'Frontend',
},
{
- name: 'JavaScript',
- iconName: 'JavaScript',
- level: 'Expert',
- years: 4,
+ name: 'Vue.js',
+ iconName: 'Vue.js',
+ level: 'Advanced',
+ years: 3,
category: 'Frontend',
},
{
name: 'TypeScript',
iconName: 'TypeScript',
- level: 'Advanced',
- years: 2,
- category: 'Frontend',
- },
- {
- name: 'Next.js',
- iconName: 'Next.js',
- level: 'Advanced',
- years: 2,
- category: 'Frontend',
- },
- {
- name: 'Node.js',
- iconName: 'Node.js',
- level: 'Intermediate',
- years: 2,
- category: 'Backend',
- },
- {
- name: 'REST APIs',
- iconName: 'REST APIs',
- level: 'Advanced',
- years: 3,
- category: 'Backend',
- },
- {
- name: 'Git & GitHub',
- iconName: 'Git & GitHub',
- level: 'Advanced',
- years: 4,
- category: 'Tools',
- },
- {
- name: 'Responsive Design',
- iconName: 'Responsive Design',
level: 'Expert',
- years: 3,
- category: 'Design',
- },
- {
- name: 'Figma',
- iconName: 'Figma',
- level: 'Intermediate',
- years: 2,
- category: 'Design',
+ years: 4,
+ category: 'Frontend',
},
{
name: 'Tailwind CSS',
iconName: 'Tailwind CSS',
level: 'Expert',
- years: 3,
+ years: 4,
category: 'Frontend',
},
+ {
+ name: '.NET',
+ iconName: '.NET',
+ level: 'Advanced',
+ years: 3,
+ category: 'Backend',
+ },
+ {
+ name: 'Express.js',
+ iconName: 'Express.js',
+ level: 'Advanced',
+ years: 3,
+ category: 'Backend',
+ },
+ {
+ name: 'Fastify',
+ iconName: 'Fastify',
+ level: 'Advanced',
+ years: 2,
+ category: 'Backend',
+ },
+ {
+ name: 'NestJS',
+ iconName: 'NestJS',
+ level: 'Advanced',
+ years: 2,
+ category: 'Backend',
+ },
+ {
+ name: 'SQL / SQS',
+ iconName: 'SQL / SQS',
+ level: 'Advanced',
+ years: 3,
+ category: 'Backend',
+ },
+ {
+ name: 'Clean Architecture',
+ iconName: 'Clean Architecture',
+ level: 'Advanced',
+ years: 3,
+ category: 'Architektur',
+ },
+ {
+ name: 'Vertical Slice Architecture',
+ iconName: 'Vertical Slice Architecture',
+ level: 'Advanced',
+ years: 3,
+ category: 'Architektur',
+ },
+ {
+ name: 'Design Patterns',
+ iconName: 'Design Patterns',
+ level: 'Advanced',
+ years: 4,
+ category: 'Architektur',
+ },
+ {
+ name: 'Docker',
+ iconName: 'Docker',
+ level: 'Advanced',
+ years: 4,
+ category: 'Tools',
+ },
+ {
+ name: 'Git & GitHub',
+ iconName: 'Git & GitHub',
+ level: 'Expert',
+ years: 5,
+ category: 'Tools',
+ },
+ {
+ name: 'Linux',
+ iconName: 'Linux',
+ level: 'Advanced',
+ years: 4,
+ category: 'Tools',
+ },
+ {
+ name: 'Figma',
+ iconName: 'Figma',
+ level: 'Advanced',
+ years: 3,
+ category: 'Design',
+ },
+ {
+ name: 'Unity',
+ iconName: 'Unity',
+ level: 'Intermediate',
+ years: 2,
+ category: 'Kreativ',
+ },
+ {
+ name: 'Blender',
+ iconName: 'Blender',
+ level: 'Intermediate',
+ years: 2,
+ category: 'Kreativ',
+ },
+ {
+ name: 'Godot',
+ iconName: 'Godot',
+ level: 'Intermediate',
+ years: 2,
+ category: 'Kreativ',
+ },
+ {
+ name: 'LaTeX',
+ iconName: 'LaTeX',
+ level: 'Intermediate',
+ years: 3,
+ category: 'Kreativ',
+ },
];
diff --git a/apps/web/src/index.css b/apps/web/src/index.css
index dc598cc..a4aed39 100644
--- a/apps/web/src/index.css
+++ b/apps/web/src/index.css
@@ -13,6 +13,7 @@
html {
scroll-behavior: smooth;
+ scroll-padding-top: 92px;
}
body {
diff --git a/apps/web/src/shared/components/Footer.tsx b/apps/web/src/shared/components/Footer.tsx
index 7d1d757..da8fce4 100644
--- a/apps/web/src/shared/components/Footer.tsx
+++ b/apps/web/src/shared/components/Footer.tsx
@@ -14,9 +14,9 @@ const Footer: React.FC = () => {
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
>
- </> Alex
+ </> Robert Bretz
- Crafting seamless digital experiences with modern web technologies
+ Building clean architecture, fast systems and modern web products.
@@ -80,7 +80,7 @@ const Footer: React.FC = () => {
{/* Copyright */}
- © {currentYear} Alex Johnson. All rights reserved.
+ © {currentYear} Robert Bretz. All rights reserved.
Built with 💚 using React & Tailwind CSS
diff --git a/apps/web/src/shared/hooks/useScrollToSection.ts b/apps/web/src/shared/hooks/useScrollToSection.ts
index 9a44b1b..88d95cd 100644
--- a/apps/web/src/shared/hooks/useScrollToSection.ts
+++ b/apps/web/src/shared/hooks/useScrollToSection.ts
@@ -4,7 +4,9 @@ export const useScrollToSection = () => {
const scrollToSection = useCallback((sectionId: string) => {
const element = document.getElementById(sectionId);
if (element) {
- element.scrollIntoView({ behavior: 'smooth' });
+ const headerOffset = 92;
+ const elementPosition = element.getBoundingClientRect().top + window.pageYOffset;
+ window.scrollTo({ top: elementPosition - headerOffset, behavior: 'smooth' });
}
}, []);
diff --git a/apps/web/src/shared/types/index.ts b/apps/web/src/shared/types/index.ts
index c8472f5..e7957ca 100644
--- a/apps/web/src/shared/types/index.ts
+++ b/apps/web/src/shared/types/index.ts
@@ -2,7 +2,7 @@ export interface Skill {
name: string;
level: 'Expert' | 'Advanced' | 'Intermediate' | 'Beginner';
years: number;
- category: 'Frontend' | 'Backend' | 'Tools' | 'Design';
+ category: 'Frontend' | 'Backend' | 'Tools' | 'Design' | 'Architektur' | 'Kreativ';
}
export interface Project {
@@ -11,7 +11,7 @@ export interface Project {
description: string;
image: string;
tags: string[];
- category: 'Web Apps' | 'UI Components' | 'Full Stack';
+ category: 'Webanwendungen' | 'UI-Komponenten' | 'Fullstack';
link?: string;
github?: string;
}