diff --git a/artifacts/joachim-portfolio/src/components/bio.tsx b/artifacts/joachim-portfolio/src/components/bio.tsx
index dcf817f..520cd29 100644
--- a/artifacts/joachim-portfolio/src/components/bio.tsx
+++ b/artifacts/joachim-portfolio/src/components/bio.tsx
@@ -1,29 +1,86 @@
import { motion } from "framer-motion";
+import { CheckCircle2 } from "lucide-react";
+
+const highlights = [
+ "30+ Jahre IT-Betrieb in Behörden & Konzernen",
+ "ITIL & BSI-Grundschutz Erfahrung",
+ "Web- & Middleware (Apache, Tomcat, JBoss, Websphere)",
+ "Docker, Ansible, Gitlab CI/CD",
+ "Technische Redaktion & Betriebshandbücher",
+ "KI-Automation seit 2023 (n8n, RAG, Pinecone)",
+ "Tech-Blogger mit 300+ Fachartikeln",
+];
+
+const clients = [
+ "Landesamt für Statistik Bayern",
+ "Polizei Hessen",
+ "Justiz Baden-Württemberg",
+ "Amt des öff. Rechts Hamburg",
+ "Finanzdienstleister München (EZB-geprüft)",
+];
export function Bio() {
return (
-
+
-
- 04. Über Mich
-
-
-
-
- Joachim Hummel ist Senior IT-Consultant, IT-Systems Engineer und technischer Umsetzer mit rund 30 Jahren Erfahrung im IT-Betrieb.
-
-
- Seine Schwerpunkte liegen auf Linux, Docker, On-Premise-Infrastrukturen, DSGVO-konformem Selfhosting, Mailservern, Monitoring, Automatisierung und KI-gestützter Softwareentwicklung.
-
-
- Mit Vibe-Coding entwickelt er aus Ideen lauffähige Anwendungen, Automatisierungen und SaaS-Projekte.
-
+
+
+
Über mich
+
+ IT-Experte mit Tiefe — und dem Blick nach vorne
+
+
+
+ Mehr als 25 Jahre Erfahrung im Aufbau, Betrieb und Management von IT-Infrastrukturen in Konzernen, Behörden und kritischen Umgebungen. Ich verbinde klassische ITIL-Prozesse und technische Betriebserfahrung mit innovativen Automatisierungslösungen auf Basis von KI und modernen Tools.
+
+
+ Mein Ansatz ist bodenständig: Technik muss funktionieren, nachvollziehbar sein und langfristig betrieben werden können. Mit Vibe-Coding bringe ich heute Ideen direkt in produktive Systeme — schnell, sauber, betreibbar.
+
+
+
+
+
Ausgewählte Kunden & Projekte
+
+ {clients.map((client) => (
+
+ {client}
+
+ ))}
+
+
+
+
+
+
+
Auf einen Blick
+
+ {highlights.map((item, index) => (
+
+
+ {item}
+
+ ))}
+
+
+
diff --git a/artifacts/joachim-portfolio/src/components/competencies.tsx b/artifacts/joachim-portfolio/src/components/competencies.tsx
index c236ba9..98b90f7 100644
--- a/artifacts/joachim-portfolio/src/components/competencies.tsx
+++ b/artifacts/joachim-portfolio/src/components/competencies.tsx
@@ -1,79 +1,107 @@
import { motion } from "framer-motion";
-import { Server, Box, ShieldCheck, Activity, Cpu } from "lucide-react";
-import { SiDocker, SiLinux, SiGrafana, SiNginx, SiUbuntu } from "react-icons/si";
+import { Server, Box, ShieldCheck, Activity, Cpu, FileText } from "lucide-react";
+import { SiDocker, SiLinux, SiGrafana, SiNginx, SiUbuntu, SiAnsible, SiPrometheus } from "react-icons/si";
const skills = [
{
icon: Server,
- title: "Linux, Serverbetrieb & Infrastruktur",
- desc: "Ubuntu, Debian, Proxmox, Systemd, Shell-Scripting, TLS, Reverse Proxy"
+ title: "Linux & Infrastruktur",
+ desc: "Ubuntu, Debian, AIX, Solaris, Proxmox, Systemd, TLS, Reverse Proxy, Shell-Scripting",
+ color: "bg-blue-50 text-blue-600 border-blue-100",
},
{
icon: Box,
- title: "Docker & Container-Betrieb",
- desc: "Docker Compose, Netzwerke, Volumes, Persistenz, Hetzner/Contabo"
+ title: "Docker & Container",
+ desc: "Docker Compose, Netzwerke, Volumes, Persistenz, Ansible, Deployment auf Hetzner & Contabo",
+ color: "bg-sky-50 text-sky-600 border-sky-100",
},
{
icon: ShieldCheck,
- title: "On-Premise & DSGVO Selfhosting",
- desc: "iRedMail/Mailcow, Nextcloud, SOGo, Authentik/OIDC, Zoraxy/Nginx"
+ title: "On-Premise & DSGVO",
+ desc: "iRedMail, Mailcow, Nextcloud, SOGo, Authentik / OIDC, ITIL, BSI-Grundschutz, Compliance",
+ color: "bg-green-50 text-green-600 border-green-100",
},
{
icon: Activity,
- title: "Monitoring",
- desc: "Grafana, Prometheus, Loki, Alloy"
+ title: "Monitoring & Betrieb",
+ desc: "Grafana, Prometheus, Loki, Alloy, Nagios, JMX-Monitoring, Metriken & Dashboards",
+ color: "bg-orange-50 text-orange-600 border-orange-100",
},
{
icon: Cpu,
- title: "KI, Automatisierung & Vibe-Coding",
- desc: "Claude Code, ChatGPT, n8n, RAG-Systeme, Pinecone"
- }
+ title: "KI & Vibe-Coding",
+ desc: "n8n, Claude Code, ChatGPT, RAG-Systeme, Pinecone, OpenAI, Ollama, API-Automation",
+ color: "bg-violet-50 text-violet-600 border-violet-100",
+ },
+ {
+ icon: FileText,
+ title: "Dokumentation & Service",
+ desc: "Betriebshandbücher, ITIL-Prozesse, BSI-Grundschutz, Confluence, Jira, draw.io",
+ color: "bg-rose-50 text-rose-600 border-rose-100",
+ },
+];
+
+const techIcons = [
+ { Icon: SiLinux, label: "Linux", color: "#000" },
+ { Icon: SiUbuntu, label: "Ubuntu", color: "#E95420" },
+ { Icon: SiDocker, label: "Docker", color: "#2496ED" },
+ { Icon: SiGrafana, label: "Grafana", color: "#F46800" },
+ { Icon: SiNginx, label: "Nginx", color: "#009639" },
+ { Icon: SiAnsible, label: "Ansible", color: "#EE0000" },
+ { Icon: SiPrometheus, label: "Prometheus", color: "#E6522C" },
];
export function Competencies() {
return (
-
+
-
- 01. Kernkompetenzen
-
-
- Über 30 Jahre Erfahrung im IT-Betrieb, destilliert in hochspezialisierte Fähigkeiten.
-
+
+
Kernkompetenzen
+
+ 30 Jahre Erfahrung — breit und tief
+
+
+ Von klassischem Serverbetrieb bis zur KI-gestützten Automatisierung — praxisbewährt in Behörden, Konzernen und eigenen Projekten.
+
+
-
+
{skills.map((skill, index) => (
-
-
+
+
-
-
{skill.title}
-
- {skill.desc}
-
+
{skill.title}
+
{skill.desc}
))}
-
-
-
-
-
-
+
+ {techIcons.map(({ Icon, label, color }) => (
+
+ { (e.currentTarget as SVGElement).style.color = color; }}
+ onMouseLeave={(e) => { (e.currentTarget as SVGElement).style.color = ""; }}
+ />
+ {label}
+
+ ))}
diff --git a/artifacts/joachim-portfolio/src/components/contact.tsx b/artifacts/joachim-portfolio/src/components/contact.tsx
index 1c8fe18..3b30c87 100644
--- a/artifacts/joachim-portfolio/src/components/contact.tsx
+++ b/artifacts/joachim-portfolio/src/components/contact.tsx
@@ -1,40 +1,88 @@
import { motion } from "framer-motion";
-import { Mail, Github, Linkedin, Terminal } from "lucide-react";
+import { Mail, ExternalLink, ArrowRight } from "lucide-react";
+
+const links = [
+ {
+ label: "Tech-Blog",
+ url: "https://blog.unixweb.de",
+ desc: "300+ Fachartikel rund um Linux, Server & IT",
+ },
+ {
+ label: "KI-Blog",
+ url: "https://ki-blog.unixweb.de",
+ desc: "KI, Automation, Vibe-Coding & n8n",
+ },
+ {
+ label: "Website",
+ url: "https://joachimhummel.de",
+ desc: "joachimhummel.de",
+ },
+];
export function Contact() {
return (
-
+
-
-
-
-
- Bereit für das nächste Projekt?
-
- Lassen Sie uns darüber sprechen, wie wir Ihre Infrastruktur modernisieren oder Ihre nächste Anwendung bauen können.
-
-
-
-
- Kontakt aufnehmen
-
+
+
+
Kontakt
+
+ Bereit für das nächste Projekt?
+
+
+ Ob Infrastruktur-Modernisierung, KI-Automation oder technische Dokumentation — ich freue mich auf Ihre Anfrage.
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
E-Mail schreiben
+
jh@unixweb.de
+
+
+
+
+
+ {links.map((link) => (
+
+
+
+
+
+
{link.label}
+
{link.desc}
+
+
+
+ ))}
+
+
+
+
+ Joachim Hummel — Senior IT-Consultant · München
+
diff --git a/artifacts/joachim-portfolio/src/components/hero.tsx b/artifacts/joachim-portfolio/src/components/hero.tsx
index 7ce49c2..58c7d17 100644
--- a/artifacts/joachim-portfolio/src/components/hero.tsx
+++ b/artifacts/joachim-portfolio/src/components/hero.tsx
@@ -1,61 +1,92 @@
import { motion } from "framer-motion";
-import { Terminal, ChevronDown } from "lucide-react";
+import { ArrowRight, ChevronDown } from "lucide-react";
+
+const badges = [
+ "30+ Jahre IT-Erfahrung",
+ "ITIL & BSI-Grundschutz",
+ "Vibe-Coding mit KI",
+ "On-Premise & DSGVO",
+];
export function Hero() {
return (
-
-
-
-
- System.init()
-
+
+
+
-
- Joachim
- Hummel
+
+
+
+ Verfügbar für neue Projekte
+
+
+
+ Joachim{" "}
+ Hummel
-
- Senior IT-Consultant · IT-Systems Engineer · Vibe-Coder
-
-
-
- Zwei Welten, eine Lösung: Tiefe, praxisbewährte Infrastruktur-Expertise
- trifft auf moderne KI-gestützte Softwareentwicklung. Ich baue Systeme, die
- in Produktion laufen – präzise, sicher und zukunftsfähig.
+
+ Senior IT-Consultant · Service Manager · Technical Writer · Vibe-Coder
-
);
}
diff --git a/artifacts/joachim-portfolio/src/components/navbar.tsx b/artifacts/joachim-portfolio/src/components/navbar.tsx
index 0ffcd65..9fc74f9 100644
--- a/artifacts/joachim-portfolio/src/components/navbar.tsx
+++ b/artifacts/joachim-portfolio/src/components/navbar.tsx
@@ -1,56 +1,104 @@
import { useState, useEffect } from "react";
import { motion, useScroll, useMotionValueEvent } from "framer-motion";
+import { Menu, X } from "lucide-react";
export function Navbar() {
const [isScrolled, setIsScrolled] = useState(false);
+ const [mobileOpen, setMobileOpen] = useState(false);
const { scrollY } = useScroll();
useMotionValueEvent(scrollY, "change", (latest) => {
- setIsScrolled(latest > 50);
+ setIsScrolled(latest > 20);
});
const navLinks = [
{ name: "Kompetenzen", href: "#competencies" },
- { name: "3 Welten", href: "#strengths" },
+ { name: "Stärken", href: "#strengths" },
{ name: "Projekte", href: "#projects" },
+ { name: "Über mich", href: "#bio" },
{ name: "Kontakt", href: "#contact" },
];
return (
-
+
+ {mobileOpen && (
+
+ {navLinks.map((link) => (
+ setMobileOpen(false)}
+ className="px-4 py-3 text-sm font-medium text-muted-foreground hover:text-foreground hover:bg-secondary rounded-lg transition-all"
+ >
+ {link.name}
+
+ ))}
+ setMobileOpen(false)}
+ className="mt-2 px-4 py-3 bg-primary text-white text-sm font-semibold rounded-lg text-center"
+ >
+ Kontakt aufnehmen
+
+
+ )}
);
}
diff --git a/artifacts/joachim-portfolio/src/components/projects.tsx b/artifacts/joachim-portfolio/src/components/projects.tsx
index 58bc3a0..78b67d9 100644
--- a/artifacts/joachim-portfolio/src/components/projects.tsx
+++ b/artifacts/joachim-portfolio/src/components/projects.tsx
@@ -1,74 +1,126 @@
import { motion } from "framer-motion";
-import { FolderGit2, ArrowRight } from "lucide-react";
+import { ArrowUpRight, Lock, Mail, Zap, Database, BarChart2, Server } from "lucide-react";
const projects = [
{
+ icon: Lock,
+ color: "from-blue-500 to-indigo-600",
+ iconBg: "bg-blue-100 text-blue-600",
title: "SafeDocs Portal",
- desc: "Sichere Upload-Plattform mit AES-256-GCM-Verschlüsselung, JWT-Auth, Passwort-Reset, Rate Limiting, Docker-Deployment",
- tags: ["Docker", "Security", "AES-256"]
+ desc: "Sichere Upload-Plattform mit AES-256-GCM-Verschlüsselung, JWT-Auth, Passwort-Reset per E-Mail, Rate Limiting und Docker-Deployment.",
+ tags: ["AES-256-GCM", "JWT", "Docker", "Security"],
+ url: "https://safedocsportal.com",
+ type: "Vibe-Coding Projekt",
},
{
+ icon: Mail,
+ color: "from-violet-500 to-purple-600",
+ iconBg: "bg-violet-100 text-violet-600",
title: "zensend.email",
- desc: "Newsletter & E-Mail-Marketing SaaS: Double-Opt-In, DSGVO, SPF/DKIM/DMARC, Zahlungsmodelle, Onboarding",
- tags: ["SaaS", "Mail", "DSGVO"]
+ desc: "Newsletter & E-Mail-Marketing SaaS mit Double-Opt-In, DSGVO-Konformität, SPF/DKIM/DMARC, Zahlungsmodellen und Onboarding-Prozessen.",
+ tags: ["SaaS", "DSGVO", "SMTP", "Newsletter"],
+ url: "https://zensend.email",
+ type: "Vibe-Coding Projekt",
},
{
+ icon: Zap,
+ color: "from-amber-500 to-orange-500",
+ iconBg: "bg-amber-100 text-amber-600",
title: "KI-Automation mit n8n",
- desc: "Automatisierte Bildgenerierung, Lead-Prozesse, KI-gestützte Bildprüfung, API/Webhook-Workflows",
- tags: ["n8n", "AI", "API"]
+ desc: "Automatisierte Bildgenerierung, Lead-Prozesse, KI-gestützte Bildprüfung und API/Webhook-Workflows für echte Geschäftsprozesse.",
+ tags: ["n8n", "OpenAI", "Webhooks", "Automation"],
+ type: "KI-Projekt",
},
{
+ icon: Database,
+ color: "from-emerald-500 to-teal-500",
+ iconBg: "bg-emerald-100 text-emerald-600",
title: "Eigene KI- & RAG-Systeme",
- desc: "PDF-Verarbeitung, Vektorisierung, Pinecone, eigene Wissensdatenbanken",
- tags: ["RAG", "Pinecone", "LLMs"]
+ desc: "PDF-Verarbeitung, Vektorisierung eigener Dokumente, Pinecone-Integration und eigene Wissensdatenbanken für KI-gestützte Recherche.",
+ tags: ["RAG", "Pinecone", "Vektoren", "LLMs"],
+ type: "KI-Projekt",
},
{
+ icon: BarChart2,
+ color: "from-orange-500 to-red-500",
+ iconBg: "bg-orange-100 text-orange-600",
title: "On-Premise Monitoring",
- desc: "Grafana, Prometheus, Loki, Alloy Stacks auf Docker-Basis",
- tags: ["Grafana", "Prometheus", "Docker"]
+ desc: "Vollständige Monitoring-Stacks mit Grafana, Prometheus, Loki und Alloy auf Docker-Basis — transparent, nachvollziehbar, betreibbar.",
+ tags: ["Grafana", "Prometheus", "Loki", "Docker"],
+ type: "Infrastruktur",
},
{
+ icon: Server,
+ color: "from-slate-500 to-gray-600",
+ iconBg: "bg-slate-100 text-slate-600",
title: "Mailserver & Groupware",
- desc: "iRedMail, Mailcow, SOGo, DNS, SPF, DKIM, DMARC, Zustellbarkeit",
- tags: ["Mailcow", "DNS", "Security"]
- }
+ desc: "Betrieb eigener Mailinfrastruktur mit iRedMail, Mailcow, SOGo inklusive vollständiger DNS-Konfiguration, SPF/DKIM/DMARC und Zustellbarkeitsanalyse.",
+ tags: ["Mailcow", "SPF/DKIM", "DNS", "IMAP"],
+ type: "Infrastruktur",
+ },
];
export function Projects() {
return (
-
+
-
- 03. Ausgewählte Projekte
-
-
- Von der sicheren Infrastruktur bis zur modernen SaaS-Lösung – in der Praxis bewährt.
-
+
+
Ausgewählte Projekte
+
+ Gebaut, deployed, betrieben
+
+
+ Reale Systeme — von der sicheren Upload-Plattform bis zur Newsletter-SaaS und eigenen KI-Infrastruktur.
+
+
-
+
{projects.map((project, index) => (
-
-
-
+
+
+ {project.url && (
+
+
+
+ )}
-
{project.title}
-
{project.desc}
-
+
+
{project.title}
+
{project.desc}
+
+
{project.tags.map((tag, tIndex) => (
-
+
{tag}
))}
diff --git a/artifacts/joachim-portfolio/src/components/strengths.tsx b/artifacts/joachim-portfolio/src/components/strengths.tsx
index 5774f2a..78e5289 100644
--- a/artifacts/joachim-portfolio/src/components/strengths.tsx
+++ b/artifacts/joachim-portfolio/src/components/strengths.tsx
@@ -3,58 +3,70 @@ import { TerminalSquare, BrainCircuit, Wrench } from "lucide-react";
const strengths = [
{
+ number: "01",
icon: TerminalSquare,
title: "Klassischer IT-Betrieb",
- desc: "Server, Netzwerke, Logs, Zertifikate, Mailserver aus 30 Jahren Praxis. Fundiertes Wissen, das die Basis für jedes zuverlässige System bildet."
+ desc: "Server, Netzwerke, Logs, Zertifikate, Mailserver — aus über 30 Jahren produktivem Betrieb in Konzernen und Behörden. Ein Fundament, das hält.",
+ highlight: "Behörden & Konzernprojekte",
},
{
+ number: "02",
icon: BrainCircuit,
title: "KI-gestützte Entwicklung",
- desc: "Vibe-Coding mit Claude Code & ChatGPT. Der direkte Weg von der Idee zur lauffähigen Anwendung, unterstützt durch modernste AI-Tools."
+ desc: "Vibe-Coding mit Claude Code & ChatGPT: Von der Idee zur lauffähigen Anwendung. KI als präzises Entwicklungswerkzeug — nicht als Buzzword.",
+ highlight: "Idee → Produktion",
},
{
+ number: "03",
icon: Wrench,
title: "Praxisnahe Umsetzung",
- desc: "Baut, testet, betreibt, dokumentiert und verbessert reale Systeme. Kein Elfenbeinturm-Engineering, sondern Lösungen, die in Produktion funktionieren."
- }
+ desc: "Bauen, testen, betreiben, dokumentieren — und verbessern. Keine Konzepte ohne Ausführung. Kein Deployment ohne Betrieb.",
+ highlight: "Nachvollziehbar & betreibbar",
+ },
];
export function Strengths() {
return (
-
+
-
- 02. 3 Welten
-
-
- Die besondere Stärke liegt in der Kombination aus klassischem Betrieb, moderner KI-Entwicklung und handfester Umsetzung.
-
+
+
Besondere Stärke
+
+ Drei Welten — eine Person
+
+
+ Die Kombination macht den Unterschied: klassisches IT-Handwerk trifft auf modernste KI-Werkzeuge und konsequente Umsetzungsstärke.
+
+
-
+
{strengths.map((item, index) => (
-
-
+
-
{item.title}
-
- {item.desc}
-
-
- {/* Decorative line */}
-
+
{item.title}
+
{item.desc}
+
+ {item.highlight}
+
))}
diff --git a/artifacts/joachim-portfolio/src/index.css b/artifacts/joachim-portfolio/src/index.css
index 7698dab..18b8075 100644
--- a/artifacts/joachim-portfolio/src/index.css
+++ b/artifacts/joachim-portfolio/src/index.css
@@ -1,3 +1,4 @@
+@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
@import "tailwindcss";
@import "tw-animate-css";
@plugin "@tailwindcss/typography";
@@ -34,7 +35,7 @@
--color-destructive: hsl(var(--destructive));
--color-destructive-foreground: hsl(var(--destructive-foreground));
- --font-sans: 'Space Grotesk', 'Inter', sans-serif;
+ --font-sans: 'Inter', system-ui, sans-serif;
--font-mono: 'JetBrains Mono', 'Menlo', monospace;
--radius-sm: calc(var(--radius) - 4px);
@@ -44,38 +45,37 @@
}
:root {
- /* Dark technical industrial theme as default */
- --background: 224 25% 6%;
- --foreground: 210 40% 98%;
+ --background: 0 0% 100%;
+ --foreground: 222 47% 11%;
- --card: 224 25% 8%;
- --card-foreground: 210 40% 98%;
- --card-border: 224 25% 12%;
+ --card: 0 0% 100%;
+ --card-foreground: 222 47% 11%;
+ --card-border: 220 13% 91%;
- --popover: 224 25% 6%;
- --popover-foreground: 210 40% 98%;
- --popover-border: 224 25% 12%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 222 47% 11%;
+ --popover-border: 220 13% 91%;
- --primary: 186 100% 42%; /* Cyan */
- --primary-foreground: 224 25% 6%;
+ --primary: 234 89% 60%;
+ --primary-foreground: 0 0% 100%;
- --secondary: 224 25% 12%;
- --secondary-foreground: 210 40% 98%;
+ --secondary: 220 14% 96%;
+ --secondary-foreground: 222 47% 11%;
- --muted: 224 25% 14%;
- --muted-foreground: 215 20% 65%;
+ --muted: 220 14% 96%;
+ --muted-foreground: 220 9% 46%;
- --accent: 224 25% 14%;
- --accent-foreground: 210 40% 98%;
+ --accent: 234 89% 97%;
+ --accent-foreground: 234 89% 40%;
--destructive: 0 84% 60%;
- --destructive-foreground: 210 40% 98%;
+ --destructive-foreground: 0 0% 100%;
- --border: 224 25% 15%;
- --input: 224 25% 15%;
- --ring: 186 100% 42%;
+ --border: 220 13% 91%;
+ --input: 220 13% 91%;
+ --ring: 234 89% 60%;
- --radius: 0.25rem;
+ --radius: 0.625rem;
}
@layer base {
@@ -83,23 +83,34 @@
@apply border-border;
}
+ html {
+ scroll-behavior: smooth;
+ }
+
body {
- @apply font-sans antialiased bg-background text-foreground selection:bg-primary/30;
+ @apply font-sans antialiased bg-background text-foreground;
}
}
-.glow-text {
- text-shadow: 0 0 20px hsl(var(--primary) / 0.5);
+.section-number {
+ @apply text-sm font-semibold tracking-widest uppercase text-primary;
}
-.glow-box {
- box-shadow: 0 0 30px hsl(var(--primary) / 0.1);
+.hero-gradient {
+ background: radial-gradient(ellipse 80% 60% at 50% -10%, hsl(234 89% 60% / 0.12) 0%, transparent 70%);
}
-/* Grid background pattern */
-.bg-grid-pattern {
- background-size: 40px 40px;
- background-image:
- linear-gradient(to right, hsl(var(--border) / 0.3) 1px, transparent 1px),
- linear-gradient(to bottom, hsl(var(--border) / 0.3) 1px, transparent 1px);
+.dot-pattern {
+ background-image: radial-gradient(circle, hsl(220 13% 91%) 1px, transparent 1px);
+ background-size: 28px 28px;
+}
+
+.card-hover {
+ transition: box-shadow 0.2s ease, transform 0.2s ease, border-color 0.2s ease;
+}
+
+.card-hover:hover {
+ box-shadow: 0 8px 30px hsl(234 89% 60% / 0.1);
+ transform: translateY(-2px);
+ border-color: hsl(234 89% 60% / 0.3);
}
diff --git a/artifacts/joachim-portfolio/src/pages/home.tsx b/artifacts/joachim-portfolio/src/pages/home.tsx
index 2a28457..fc6da50 100644
--- a/artifacts/joachim-portfolio/src/pages/home.tsx
+++ b/artifacts/joachim-portfolio/src/pages/home.tsx
@@ -1,4 +1,3 @@
-import { motion } from "framer-motion";
import { Hero } from "@/components/hero";
import { Competencies } from "@/components/competencies";
import { Projects } from "@/components/projects";
@@ -9,37 +8,31 @@ import { Navbar } from "@/components/navbar";
export default function Home() {
return (
-
- {/* Background grid */}
-
-
- {/* Subtle ambient glow */}
-
-
+