fix: English headings, remove scroll-gated animations, reduce padding, drop mtg-builder
Some checks failed
Release / Release (push) Has been cancelled
Release / Build & Push Docker Image (push) Has been cancelled

This commit is contained in:
Tuan-Dat Tran
2026-07-08 00:36:03 +02:00
parent e765551709
commit 76746e0e9e
7 changed files with 37 additions and 74 deletions

View File

@@ -214,15 +214,6 @@ export async function initDB() {
"Tailwind CSS", "Tailwind CSS",
"WebAssembly" "WebAssembly"
] ]
},
{
"id": 5,
"name": "mtg-builder",
"description": "CLI Magic: The Gathering (Commander/EDH) deck-builder and collection manager using the Scryfall API, with exponential backoff retry logic.",
"url": "https://git.tudattr.dev/tudattr/mtg-builder",
"tech": [
"Rust"
]
} }
] ]
}) })

View File

@@ -7,25 +7,20 @@ export default function Education() {
const { education } = data; const { education } = data;
return ( return (
<section id="education" className="py-20 px-6"> <section id="education" className="py-12 px-6">
<div className="max-w-4xl mx-auto"> <div className="max-w-4xl mx-auto">
<motion.h2 <motion.h2
initial={{ opacity: 0 }} initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }} animate={{ opacity: 1 }}
viewport={{ once: true }}
className="text-3xl font-bold text-slate-900 mb-12 text-center" className="text-3xl font-bold text-slate-900 mb-12 text-center"
> >
Ausbildung Education
</motion.h2> </motion.h2>
<div className="grid md:grid-cols-2 gap-6"> <div className="grid md:grid-cols-2 gap-6">
{education.map((edu, index) => ( {education.map((edu, index) => (
<motion.div <div
key={edu.id} key={edu.id}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: index * 0.2 }}
className="bg-white rounded-xl p-6 shadow-sm border border-slate-100" className="bg-white rounded-xl p-6 shadow-sm border border-slate-100"
> >
<div className="flex items-start gap-4"> <div className="flex items-start gap-4">
@@ -44,7 +39,7 @@ export default function Education() {
</span> </span>
</div> </div>
</div> </div>
</motion.div> </div>
))} ))}
</div> </div>
</div> </div>

View File

@@ -7,25 +7,20 @@ export default function Experience() {
const { experience } = data; const { experience } = data;
return ( return (
<section id="experience" className="py-20 px-6"> <section id="experience" className="py-12 px-6">
<div className="max-w-4xl mx-auto"> <div className="max-w-4xl mx-auto">
<motion.h2 <motion.h2
initial={{ opacity: 0 }} initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }} animate={{ opacity: 1 }}
viewport={{ once: true }}
className="text-3xl font-bold text-slate-900 mb-12 text-center" className="text-3xl font-bold text-slate-900 mb-12 text-center"
> >
Berufserfahrung Experience
</motion.h2> </motion.h2>
<div className="relative"> <div className="relative">
{experience.map((exp, index) => ( {experience.map((exp, index) => (
<motion.div <div
key={exp.id} key={exp.id}
initial={{ opacity: 0, x: -20 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
transition={{ delay: index * 0.2 }}
className="relative pl-8 pb-12 last:pb-0" className="relative pl-8 pb-12 last:pb-0"
> >
<div className="absolute left-0 top-2 w-4 h-4 rounded-full bg-primary-500 border-4 border-primary-100" /> <div className="absolute left-0 top-2 w-4 h-4 rounded-full bg-primary-500 border-4 border-primary-100" />
@@ -63,7 +58,7 @@ export default function Experience() {
))} ))}
</ul> </ul>
</div> </div>
</motion.div> </div>
))} ))}
</div> </div>
</div> </div>

View File

@@ -7,7 +7,7 @@ export default function Hero() {
const { personal } = data; const { personal } = data;
return ( return (
<section className="min-h-screen flex items-center justify-center px-6 py-20"> <section className="flex items-center justify-center px-6 py-16">
<motion.div <motion.div
initial={{ opacity: 0, y: 20 }} initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}

View File

@@ -7,17 +7,16 @@ export default function Projects() {
const { projects } = data; const { projects } = data;
return ( return (
<section id="projects" className="py-20 px-6 bg-white"> <section id="projects" className="py-12 px-6 bg-white">
<div className="max-w-4xl mx-auto"> <div className="max-w-4xl mx-auto">
<motion.h2 <motion.h2
initial={{ opacity: 0 }} initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }} animate={{ opacity: 1 }}
viewport={{ once: true }}
className="text-3xl font-bold text-slate-900 mb-12 text-center" className="text-3xl font-bold text-slate-900 mb-12 text-center"
> >
Projekte Projects
</motion.h2> </motion.h2>
<div className="grid md:grid-cols-2 gap-6"> <div className="grid md:grid-cols-2 gap-6">
{projects.map((project, index) => ( {projects.map((project, index) => (
<motion.a <motion.a
@@ -25,10 +24,6 @@ export default function Projects() {
href={project.url} href={project.url}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: index * 0.2 }}
whileHover={{ y: -4 }} whileHover={{ y: -4 }}
className="group bg-slate-50 rounded-xl p-6 border border-slate-100 hover:border-primary-200 hover:shadow-md transition-all" className="group bg-slate-50 rounded-xl p-6 border border-slate-100 hover:border-primary-200 hover:shadow-md transition-all"
> >

View File

@@ -5,17 +5,22 @@ const skillIcons = {
"Docker": "🐳", "Docker": "🐳",
"Kubernetes": "☸️", "Kubernetes": "☸️",
"Helm": "⛵", "Helm": "⛵",
"Jenkins": "🔧",
"Bitbucket": "📘",
"ArgoCD": "🔄", "ArgoCD": "🔄",
"Jenkins": "🔧",
"Bitbucket Pipelines": "📘",
"Git": "📝", "Git": "📝",
"Azure": "☁️", "Azure": "☁️",
"Azure Resource Manager": "🏗", "Azure AKS": "",
"Release Engineering": "🚀", "Ansible": "⚙️",
"Linux Administration": "🐧", "ELK Stack": "📊",
"PostgreSQL": "🐘",
"MongoDB": "🍃",
"Rust": "🦀",
"Python": "🐍", "Python": "🐍",
"Bash": "💻", "Bash": "💻",
"Rust": "🦀" "P4": "🔬",
"Intel Tofino": "🔬",
"Linux Administration": "🐧",
}; };
export default function Skills() { export default function Skills() {
@@ -23,25 +28,20 @@ export default function Skills() {
const { skills } = data; const { skills } = data;
return ( return (
<section id="skills" className="py-20 px-6 bg-white"> <section id="skills" className="py-12 px-6 bg-white">
<div className="max-w-4xl mx-auto"> <div className="max-w-4xl mx-auto">
<motion.h2 <motion.h2
initial={{ opacity: 0 }} initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }} animate={{ opacity: 1 }}
viewport={{ once: true }}
className="text-3xl font-bold text-slate-900 mb-12 text-center" className="text-3xl font-bold text-slate-900 mb-12 text-center"
> >
Skills Skills
</motion.h2> </motion.h2>
<div className="grid md:grid-cols-2 gap-8"> <div className="grid md:grid-cols-2 gap-8">
{Object.entries(skills).map(([category, items], catIndex) => ( {Object.entries(skills).map(([category, items], catIndex) => (
<motion.div <div
key={category} key={category}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: catIndex * 0.1 }}
className="bg-slate-50 rounded-xl p-6" className="bg-slate-50 rounded-xl p-6"
> >
<h3 className="text-lg font-semibold text-primary-600 mb-4"> <h3 className="text-lg font-semibold text-primary-600 mb-4">
@@ -51,10 +51,6 @@ export default function Skills() {
{items.map((skill, i) => ( {items.map((skill, i) => (
<motion.span <motion.span
key={skill} key={skill}
initial={{ opacity: 0, scale: 0.8 }}
whileInView={{ opacity: 1, scale: 1 }}
viewport={{ once: true }}
transition={{ delay: i * 0.05 }}
whileHover={{ scale: 1.05 }} whileHover={{ scale: 1.05 }}
className="px-3 py-1.5 bg-white rounded-lg text-sm text-slate-700 shadow-sm border border-slate-100 flex items-center gap-1.5 cursor-default" className="px-3 py-1.5 bg-white rounded-lg text-sm text-slate-700 shadow-sm border border-slate-100 flex items-center gap-1.5 cursor-default"
> >
@@ -63,7 +59,7 @@ export default function Skills() {
</motion.span> </motion.span>
))} ))}
</div> </div>
</motion.div> </div>
))} ))}
</div> </div>
</div> </div>

View File

@@ -189,15 +189,6 @@
"Tailwind CSS", "Tailwind CSS",
"WebAssembly" "WebAssembly"
] ]
},
{
"id": 5,
"name": "mtg-builder",
"description": "CLI Magic: The Gathering (Commander/EDH) deck-builder and collection manager using the Scryfall API, with exponential backoff retry logic.",
"url": "https://git.tudattr.dev/tudattr/mtg-builder",
"tech": [
"Rust"
]
} }
] ]
} }