jamulix-homepage/components/about-section.tsx

132 lines
6.1 KiB
TypeScript
Raw Normal View History

2026-04-24 17:12:51 +02:00
'use client'
import { motion } from 'framer-motion'
const timeline = [
{
era: '1976',
2026-04-24 17:12:51 +02:00
title: 'Der Anfang',
description: 'Erste Programme in Fortran IV. Lochkarten, Großrechner, Batch-Verarbeitung. Erste Programmierkurse im Rahmen des VWL-Studiums. Die Grundlagen des algorithmischen Denkens.',
2026-04-24 17:12:51 +02:00
tech: ['Fortran IV'],
},
{
era: '1984',
title: 'Der erste PC',
description: 'Erste Programme in Basic, C und Pascal auf dem Personal Computer unter DOS. Datenbanken, Textverarbeitung, Spiele.',
tech: ['Lotus 1-2-3', 'dBASE', 'QBasic', 'Turbo Pascal', 'Norton Commander', 'WordPerfect'],
},
2026-04-24 17:12:51 +02:00
{
era: '1986',
title: 'Systemnahe Programmierung',
description: 'C und 68000-Assembler auf dem Atari ST. Direkte Hardware-Ansteuerung, Interrupt-Routinen, Speicherverwaltung von Hand. Pseudo-Multitasking. DFÜ mit Akustikkoppler. Maiboxen, FidoNet, MausNet.',
tech: ['C', '68000 ASM', 'GFA Basic', 'TOS'],
2026-04-24 17:12:51 +02:00
},
{
era: '1990',
title: 'Unix an der Universität',
description: 'AIX, HP-UX, BSD. Die Philosophie kleiner, zusammenarbeitender Programme. Shell-Scripting als Werkzeug. Internet. Sysop-Aufgaben im Uni-Rechenzentrum.',
tech: ['Unix', 'Shell', 'vi', 'Gopher'],
2026-04-24 17:12:51 +02:00
},
{
era: '1992',
2026-04-24 17:12:51 +02:00
title: 'Linux entdeckt',
description: 'Slackware auf 40 Disketten, Debian, SUSE Linux ... Der Beginn einer dauerhaften Begeisterung für offene Systeme und Selbstbestimmung. C, C++, Pascal, Modula, Perl, Shell-Skript. Internet per Modem. Pentesting, Hacking.',
2026-04-24 17:12:51 +02:00
tech: ['Linux', 'GNU Tools', 'X11'],
},
{
era: '1995 ff.',
title: 'World Wide Web',
description: 'Permanenter privater Internet-Zugang kommerzieller Anbieter und erste eigene Domain: linix.de. World Wide Web. Eigene Webseiten in HTML und JavaScript programmiert.',
tech: ['WWW', 'Netscape', 'HTML', 'Java', 'JavaScript', 'Modem'],
},
2026-04-24 17:12:51 +02:00
{
era: '2000er',
title: 'Professionelle Entwicklung',
description: 'Verschiedene Sprachen, verschiedene Domänen. Server-Administration, Automatisierung, Web-Entwicklung. Systemadministration, Networking, Linux-Server und vHosts im Netz und lokal, Selfhosting, Internet-Programmierung, APIs, Nachrichten-Scraping, automatische und dynamische Webseiten Generierung, Container, Virtuelle Maschinen, Hypervisor, Automaten, Toolchains, Browser-Fernsteuerung. — Alles unter Linux. Einplatinen Computer, Microcontroller.',
tech: ['Perl', 'PHP', 'Bash', 'Python', 'Go', 'Raspberry Pi', 'Arduino', 'ESP32', 'Proxmox', 'Yunohost', 'Jamulus', 'Jitsi', 'Selenium/Playwright', 'Docker/Podman'],
2026-04-24 17:12:51 +02:00
},
{
era: '2022',
title: 'KI-Fokus',
description: 'Seit Ende 2022 intensive Beschäftigung mit KI-Tools und KI-Programmierung. LLMs als Arbeitswerkzeug und Forschungsgegenstand.',
tech: ['Python', 'Rust', 'LLMs', 'ML'],
},
]
export function AboutSection() {
return (
<section id="ueber" className="py-24 lg:py-32">
<div className="max-w-6xl mx-auto px-6 lg:px-8">
{/* Section Header */}
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6 }}
className="mb-16 lg:mb-24"
>
<span className="font-mono text-xs tracking-wider text-accent uppercase">
Hintergrund
</span>
<h2 className="font-serif text-3xl sm:text-4xl lg:text-5xl mt-4 text-balance">
Fünf Jahrzehnte Programmierung
2026-04-24 17:12:51 +02:00
</h2>
<p className="mt-6 text-lg text-muted-foreground max-w-2xl">
Eine Reise durch die Evolution der Software-Entwicklung
von Lochkarten bis zu Large Language Models, Vibe-Coding und agentischen KISystemen.
2026-04-24 17:12:51 +02:00
</p>
</motion.div>
{/* Timeline */}
<div className="relative">
{/* Vertical line */}
<div className="absolute left-0 lg:left-1/2 top-0 bottom-0 w-px bg-border lg:-translate-x-px hidden sm:block" />
<div className="space-y-12 lg:space-y-16">
{timeline.map((item, index) => (
<motion.div
key={item.era}
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-50px' }}
transition={{ duration: 0.5, delay: index * 0.1 }}
className={`relative grid lg:grid-cols-2 gap-8 lg:gap-16 ${
index % 2 === 0 ? '' : 'lg:direction-rtl'
}`}
>
{/* Timeline dot */}
<div className="absolute left-0 lg:left-1/2 top-0 -translate-x-1/2 hidden sm:block">
<div className="size-3 rounded-full bg-background border-2 border-accent" />
</div>
{/* Content */}
<div className={`pl-8 sm:pl-12 lg:pl-0 ${index % 2 === 0 ? 'lg:pr-16 lg:text-right' : 'lg:col-start-2 lg:pl-16'}`}>
<div className={`lg:direction-ltr ${index % 2 === 0 ? 'lg:ml-auto lg:max-w-md' : 'lg:max-w-md'}`}>
<span className="font-mono text-sm text-accent">{item.era}</span>
<h3 className="font-serif text-xl lg:text-2xl mt-2">{item.title}</h3>
<p className="mt-3 text-muted-foreground leading-relaxed">
{item.description}
</p>
<div className={`mt-4 flex flex-wrap gap-2 ${index % 2 === 0 ? 'lg:justify-end' : ''}`}>
{item.tech.map((tech) => (
<span
key={tech}
className="font-mono text-xs px-2 py-1 bg-secondary text-secondary-foreground rounded"
>
{tech}
</span>
))}
</div>
</div>
</div>
{/* Spacer for alternating layout */}
{index % 2 !== 0 && <div className="hidden lg:block" />}
</motion.div>
))}
</div>
</div>
</div>
</section>
)
}