import { useEffect, createContext, useContext, useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { useInView } from 'react-intersection-observer'; import Lenis from '@studio-freight/lenis'; import Head from 'next/head'; import Image from "next/image"; import React from 'react'; import '@fontsource/dm-sans/400.css'; import '@fontsource/dm-sans/500.css'; import '@fontsource/dm-sans/600.css'; import '@fontsource/dm-sans/700.css'; import '@fontsource/instrument-sans/400.css'; import '@fontsource/instrument-sans/500.css'; import Link from 'next/link'; type Theme = 'black' | 'red' | 'gold'; type ThemeContextType = { theme: Theme; setTheme: (theme: Theme) => void; }; const ThemeContext = createContext({ theme: 'black', setTheme: () => {}, }); const ThemeProvider = ({ children }: { children: React.ReactNode }) => { const [theme, setTheme] = useState('black'); return (
{children}
); }; const useSmoothScroll = () => { useEffect(() => { const lenis = new Lenis({ duration: 1.2, easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), orientation: 'vertical', smoothWheel: true, touchMultiplier: 2, }); function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } requestAnimationFrame(raf); return () => { lenis.destroy(); }; }, []); }; const FadeIn = ({ children, className = "", delay = 0 }: { children: React.ReactNode; className?: string; delay?: number }) => { const [ref, inView] = useInView({ triggerOnce: true, threshold: 0.1, rootMargin: "0px 0px -10% 0px" }); return ( {children} ); }; const GermanyText = () => { const { theme, setTheme } = useContext(ThemeContext); return ( setTheme('black')} className={theme === 'black' ? 'ring-1 ring-white/20' : ''} whileHover={{ scale: 1.05 }} whileTap={{ scale: 0.95 }} /> setTheme('red')} className={theme === 'red' ? 'ring-1 ring-white/20' : ''} whileHover={{ scale: 1.05 }} whileTap={{ scale: 0.95 }} /> setTheme('gold')} className={theme === 'gold' ? 'ring-1 ring-white/20' : ''} whileHover={{ scale: 1.05 }} whileTap={{ scale: 0.95 }} /> ); }; const MobileMenu = () => { const [isOpen, setIsOpen] = useState(false); const menuRef = React.useRef(null); useEffect(() => { if (isOpen) { document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = ''; } return () => { document.body.style.overflow = ''; }; }, [isOpen]); useEffect(() => { const handleEscKey = (e: KeyboardEvent) => { if (e.key === 'Escape' && isOpen) { setIsOpen(false); } }; document.addEventListener('keydown', handleEscKey); return () => document.removeEventListener('keydown', handleEscKey); }, [isOpen]); return ( <> setIsOpen(true)} className="p-2 theme-accent rounded-lg theme-border" aria-label="Open menu" aria-expanded={isOpen} whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} > {isOpen && ( <> {/* Overlay - increased opacity */} setIsOpen(false)} aria-hidden="true" /> {/* Menu container - full height */} {/* Glass background and content wrapper with explicit backdrop filter */}
{/* Close button */} setIsOpen(false)} className="absolute top-4 right-4 p-2 theme-accent rounded-lg theme-border z-[110]" aria-label="Close menu" initial={{ opacity: 0, scale: 0.8 }} animate={{ opacity: 1, scale: 1 }} transition={{ type: "spring", stiffness: 300, damping: 20, delay: 0.2 }} whileHover={{ scale: 1.05 }} whileTap={{ scale: 0.95 }} > {/* Content wrapper with padding and scrolling */}
{/* Navigation links */} {/* Footer content */}
setIsOpen(false)} className="flex items-center justify-center gap-3 w-full py-4 px-6 theme-primary border theme-border rounded-lg hover:theme-bg-05 transition-colors" whileHover={{ scale: 1.02 }} > Contact Me
)}
); }; export default function Home() { useSmoothScroll(); return (
Jan-Marlon Leibl • Fullstack Software Developer | PHP & TypeScript Expert {/* Primary Meta Tags */} {/* Open Graph / Facebook */} {/* Twitter */} {/* Favicon */} {/* Canonical */}
Available for Work

Jan-Marlon Leibl

Software Developer
based in

Passionate about creating digital experiences, with a focus on PHP and modern web technologies.

View My Work Get in Touch
Role Fullstack Developer
Experience 5+ Years

About

Jan-Marlon Leibl - Fullstack Software Developer

Jan-Marlon Leibl

Fullstack Developer

Hello! I'm Jan-Marlon, but please call me Jan. I started my journey in programming at the age of 11 with C#, fascinated by a desktop application my friend created.

Today, I specialize in PHP and TypeScript development, constantly pushing the boundaries of what's possible on the web. My journey has led me from creating simple applications to developing complex systems used by thousands.

Technologies

    {['PHP', 'JavaScript', 'MySQL', 'React'].map((tech) => (
  • {tech}
  • ))}

Interests

    {[ 'Web Development', 'System Architecture', 'UI/UX Design', 'Performance Optimization' ].map((interest) => (
  • {interest}
  • ))}
View GitHub Connect on LinkedIn
Portfolio

Selected Work

{[ { title: 'ventry.host v2', year: '2025', description: 'Free file hosting revamped with a modern design and improved user experience.', tags: ['Next.js', 'Tailwind CSS', 'TypeScript'] }, { title: 'ventry.host', year: '2023', description: 'A free file hosting solution with thousands of daily visitors.', tags: ['PHP', 'JavaScript', 'MySQL'] }, { title: 'ShareUpload', year: '2022', description: 'High-performance file sharing platform with unlimited storage.', tags: ['PHP', 'MySQL', 'Performance'] }, { title: 'RestoreM', year: '2023', description: 'Discord server backup and restoration service.', tags: ['PHP', 'MySQL', 'Discord API'] } ].map((project, index) => (
{project.year}

{project.title}

{project.description}

Technologies

{project.tags.map((tag, tagIndex) => ( {tag}{tagIndex !== project.tags.length - 1 && ( )} ))}
))}
); }