diff --git a/icons/ubuntu.svg b/icons/ubuntu.svg new file mode 100644 index 0000000..41d3d82 --- /dev/null +++ b/icons/ubuntu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/index.php b/index.php index 8e9581e..0daf7e2 100644 --- a/index.php +++ b/index.php @@ -26,6 +26,14 @@ $projects = [ "color" => "#0082c9", "external" => true ], + [ + "title" => "Server Dashboard", + "description" => "Server-Verwaltung mit Cockpit", + "url" => "https://fabianschieder.com:9090", + "logo" => "/icons/ubuntu.svg", + "color" => "#E95420", + "external" => true + ], ], "schule" => [ [ @@ -134,6 +142,22 @@ $projects = [

© Fabian Schieder — Alle Rechte vorbehalten.

+ + diff --git a/style.css b/style.css index f65f170..cfb1700 100644 --- a/style.css +++ b/style.css @@ -34,21 +34,41 @@ body { } /* ===== BACKGROUND GLOW ===== */ +@keyframes bgShift { + 0% { opacity: 1; transform: scale(1) translate(0, 0); } + 33% { opacity: 0.85; transform: scale(1.08) translate(2%, 3%); } + 66% { opacity: 0.9; transform: scale(0.97) translate(-3%, -2%); } + 100% { opacity: 1; transform: scale(1) translate(0, 0); } +} + .background-blur { position: fixed; inset: 0; z-index: -1; background: - radial-gradient(ellipse 60% 40% at 20% 10%, rgba(99, 102, 241, 0.15), transparent), - radial-gradient(ellipse 50% 40% at 80% 80%, rgba(14, 165, 233, 0.10), transparent); + radial-gradient(ellipse 60% 40% at 20% 10%, rgba(99, 102, 241, 0.18), transparent), + radial-gradient(ellipse 50% 40% at 80% 80%, rgba(14, 165, 233, 0.13), transparent), + radial-gradient(ellipse 40% 30% at 60% 40%, rgba(168, 85, 247, 0.08), transparent); pointer-events: none; + animation: bgShift 12s ease-in-out infinite; } /* ===== HEADER ===== */ +@keyframes fadeDown { + from { opacity: 0; transform: translateY(-20px); } + to { opacity: 1; transform: translateY(0); } +} + header { text-align: center; margin-bottom: 3.5rem; margin-top: 2rem; + animation: fadeDown 0.7s ease both; +} + +@keyframes avatarPulse { + 0%, 100% { box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.2), 0 0 20px rgba(99, 102, 241, 0.1); } + 50% { box-shadow: 0 0 0 8px rgba(99, 102, 241, 0.12), 0 0 40px rgba(99, 102, 241, 0.2); } } .avatar { @@ -64,6 +84,14 @@ header { margin: 0 auto 1.2rem; letter-spacing: 1px; box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.2); + animation: avatarPulse 3s ease-in-out infinite; + transition: transform 0.3s ease; + cursor: default; + user-select: none; +} + +.avatar:hover { + transform: scale(1.08) rotate(6deg); } h1 { @@ -93,12 +121,23 @@ main { } /* ===== CATEGORY SECTION ===== */ +@keyframes fadeUp { + from { opacity: 0; transform: translateY(24px); } + to { opacity: 1; transform: translateY(0); } +} + section { display: flex; flex-direction: column; gap: 1rem; + animation: fadeUp 0.6s ease both; } +section:nth-child(1) { animation-delay: 0.15s; } +section:nth-child(2) { animation-delay: 0.30s; } +section:nth-child(3) { animation-delay: 0.45s; } +section:nth-child(4) { animation-delay: 0.60s; } + .category-title { font-size: 0.78rem; font-weight: 600; @@ -146,13 +185,13 @@ section { .card:hover { background: var(--surface-hover); - border-color: rgba(255, 255, 255, 0.14); - transform: translateY(-2px); - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.35); + border-color: color-mix(in srgb, var(--accent, #6366f1) 40%, transparent); + transform: translateY(-3px) scale(1.01); + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.4), 0 0 0 1px color-mix(in srgb, var(--accent, #6366f1) 20%, transparent); } .card:hover::before { - opacity: 0.07; + opacity: 0.10; } .card:active { @@ -172,11 +211,12 @@ section { justify-content: center; font-size: 1.25rem; color: var(--accent, #6366f1); - transition: background var(--transition); + transition: background var(--transition), transform var(--transition); } .card:hover .card-icon { background: rgba(255, 255, 255, 0.09); + transform: scale(1.1) rotate(-4deg); } .card-logo { @@ -240,6 +280,12 @@ footer { color: var(--text-muted); font-size: 0.8rem; text-align: center; + animation: fadeUp 0.6s ease 0.7s both; + transition: color 0.3s; +} + +footer:hover { + color: var(--text); } /* ===== RESPONSIVE ===== */ @@ -253,5 +299,19 @@ footer { } } +/* ===== RIPPLE ===== */ +.card .ripple { + position: absolute; + border-radius: 50%; + transform: scale(0); + animation: ripple-anim 0.55s linear; + background: rgba(255, 255, 255, 0.15); + pointer-events: none; +} + +@keyframes ripple-anim { + to { transform: scale(4); opacity: 0; } +} +