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",
"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;
return (
<section id="education" className="py-20 px-6">
<section id="education" className="py-12 px-6">
<div className="max-w-4xl mx-auto">
<motion.h2
<motion.h2
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
viewport={{ once: true }}
animate={{ opacity: 1 }}
className="text-3xl font-bold text-slate-900 mb-12 text-center"
>
Ausbildung
Education
</motion.h2>
<div className="grid md:grid-cols-2 gap-6">
{education.map((edu, index) => (
<motion.div
<div
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"
>
<div className="flex items-start gap-4">
@@ -44,7 +39,7 @@ export default function Education() {
</span>
</div>
</div>
</motion.div>
</div>
))}
</div>
</div>

View File

@@ -7,25 +7,20 @@ export default function Experience() {
const { experience } = data;
return (
<section id="experience" className="py-20 px-6">
<section id="experience" className="py-12 px-6">
<div className="max-w-4xl mx-auto">
<motion.h2
<motion.h2
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
viewport={{ once: true }}
animate={{ opacity: 1 }}
className="text-3xl font-bold text-slate-900 mb-12 text-center"
>
Berufserfahrung
Experience
</motion.h2>
<div className="relative">
{experience.map((exp, index) => (
<motion.div
<div
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"
>
<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>
</div>
</motion.div>
</div>
))}
</div>
</div>

View File

@@ -7,7 +7,7 @@ export default function Hero() {
const { personal } = data;
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
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}

View File

@@ -7,17 +7,16 @@ export default function Projects() {
const { projects } = data;
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">
<motion.h2
<motion.h2
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
viewport={{ once: true }}
animate={{ opacity: 1 }}
className="text-3xl font-bold text-slate-900 mb-12 text-center"
>
Projekte
Projects
</motion.h2>
<div className="grid md:grid-cols-2 gap-6">
{projects.map((project, index) => (
<motion.a
@@ -25,10 +24,6 @@ export default function Projects() {
href={project.url}
target="_blank"
rel="noopener noreferrer"
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: index * 0.2 }}
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"
>

View File

@@ -5,17 +5,22 @@ const skillIcons = {
"Docker": "🐳",
"Kubernetes": "☸️",
"Helm": "⛵",
"Jenkins": "🔧",
"Bitbucket": "📘",
"ArgoCD": "🔄",
"Jenkins": "🔧",
"Bitbucket Pipelines": "📘",
"Git": "📝",
"Azure": "☁️",
"Azure Resource Manager": "🏗",
"Release Engineering": "🚀",
"Linux Administration": "🐧",
"Azure AKS": "",
"Ansible": "⚙️",
"ELK Stack": "📊",
"PostgreSQL": "🐘",
"MongoDB": "🍃",
"Rust": "🦀",
"Python": "🐍",
"Bash": "💻",
"Rust": "🦀"
"P4": "🔬",
"Intel Tofino": "🔬",
"Linux Administration": "🐧",
};
export default function Skills() {
@@ -23,25 +28,20 @@ export default function Skills() {
const { skills } = data;
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">
<motion.h2
<motion.h2
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
viewport={{ once: true }}
animate={{ opacity: 1 }}
className="text-3xl font-bold text-slate-900 mb-12 text-center"
>
Skills
</motion.h2>
<div className="grid md:grid-cols-2 gap-8">
{Object.entries(skills).map(([category, items], catIndex) => (
<motion.div
<div
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"
>
<h3 className="text-lg font-semibold text-primary-600 mb-4">
@@ -51,10 +51,6 @@ export default function Skills() {
{items.map((skill, i) => (
<motion.span
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 }}
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>
))}
</div>
</motion.div>
</div>
))}
</div>
</div>

View File

@@ -189,15 +189,6 @@
"Tailwind CSS",
"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"
]
}
]
}