fix: English headings, remove scroll-gated animations, reduce padding, drop mtg-builder
This commit is contained in:
@@ -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"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 }}
|
||||||
|
|||||||
@@ -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"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user