diff --git a/index.html b/index.html index c3dc57e..eee712f 100644 --- a/index.html +++ b/index.html @@ -262,7 +262,7 @@

🌐 - Public Services + Public Services Open Access

@@ -326,7 +326,7 @@

🔒 - Private Services + Private Services Restricted Access

@@ -517,80 +517,74 @@
- -
+ +
- 🌐 Sub-Domains -

Network

-

Explore the LemonLink ecosystem

+ 🛠️ Toolbox +

Skills & Stack

+

Technologies and tools I work with

-
-
-
- 🍋 - lemonlink.eu -
-
- - - - - - - - - +
+
+

Virtualization

+
+ Proxmox VE + KVM/QEMU + LXC Containers + VMware
-
- -
- cloud - Nextcloud Storage -
- -
- git - Gitea Repositories -
- -
- stats - Netdata Monitoring -
- -
- photos - Immich Gallery -
- -
- dash - Homarr Dashboard -
- -
- vpn - Tailscale Access -
- -
- www - This Website -
- -
- projects - My Code -
- -
- retro - 🎮 Classic Games -
+
+

Containerization

+
+ Docker + Docker Compose + Portainer + Kubernetes +
+
+ +
+

Networking

+
+ Nginx Proxy Manager + Tailscale + VLANs + WireGuard +
+
+ +
+

Storage

+
+ TrueNAS SCALE + ZFS + NFS + Samba +
+
+ +
+

Monitoring

+
+ Netdata + Grafana + Prometheus + Uptime Kuma +
+
+ +
+

Development

+
+ Git/Gitea + CI/CD + Bash + Python +
diff --git a/script.js b/script.js index 8330d8d..cad4cb1 100644 --- a/script.js +++ b/script.js @@ -363,8 +363,6 @@ function initLimitedTerminalTyping() { ]; let currentCommand = 0; - let cycleCount = 0; - const maxCycles = 3; let isTyping = false; const typeCommand = () => { @@ -416,13 +414,7 @@ function initLimitedTerminalTyping() { terminal.scrollTop = terminal.scrollHeight; isTyping = false; - currentCommand++; - - // Count completed cycles - if (currentCommand >= commands.length) { - currentCommand = 0; - cycleCount++; - } + currentCommand = (currentCommand + 1) % commands.length; }, 500); } }; @@ -430,18 +422,19 @@ function initLimitedTerminalTyping() { typeChar(); }; - // Start typing effect every 5 seconds - loops forever, clears after 3 cycles - setInterval(() => { - // Reset terminal after 3 cycles - if (cycleCount >= maxCycles) { - // Clear all dynamic content - const dynamicContent = terminal.querySelectorAll('.terminal-line:nth-child(n+4), .terminal-output'); - dynamicContent.forEach(el => el.remove()); - currentCommand = 0; - cycleCount = 0; + // Start typing effect - only run 3 commands total, then stop + let commandsTyped = 0; + const maxCommands = 3; + + const intervalId = setInterval(() => { + if (commandsTyped >= maxCommands) { + clearInterval(intervalId); + // Just keep the cursor blinking on last line + return; } typeCommand(); - }, 5000); + commandsTyped++; + }, 4000); } /** diff --git a/styles.css b/styles.css index f7e5228..e1a421e 100644 --- a/styles.css +++ b/styles.css @@ -1709,13 +1709,23 @@ body { .category-title { font-family: 'Space Grotesk', sans-serif; - font-size: 1.25rem; + font-size: 1.1rem; font-weight: 600; - color: var(--color-text); + color: var(--color-text-muted); margin-bottom: 1.5rem; display: flex; align-items: center; - gap: 0.75rem; + gap: 0.5rem; + text-transform: uppercase; + letter-spacing: 1px; +} + +.category-title .category-icon { + font-size: 1.2rem; +} + +.category-title-text { + color: var(--color-text); } .category-icon { @@ -1766,3 +1776,78 @@ body { width: 20px; height: 20px; } + + +/* ======================================== + Skills Section + ======================================== */ +.skills-section { + background: linear-gradient(180deg, transparent 0%, rgba(99, 102, 241, 0.05) 50%, transparent 100%); +} + +.skills-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1.5rem; +} + +.skill-category { + background: var(--color-bg-card); + backdrop-filter: blur(20px); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + padding: 1.5rem; + transition: var(--transition-normal); +} + +.skill-category:hover { + transform: translateY(-3px); + border-color: rgba(234, 179, 8, 0.3); + box-shadow: var(--shadow-card); +} + +.skill-cat-title { + font-family: 'Space Grotesk', sans-serif; + font-size: 0.9rem; + font-weight: 600; + color: var(--color-text-muted); + text-transform: uppercase; + letter-spacing: 1px; + margin-bottom: 1rem; + padding-bottom: 0.5rem; + border-bottom: 1px solid var(--color-border); +} + +.skill-tags { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.skill-tag { + padding: 0.4rem 0.8rem; + background: rgba(255, 255, 255, 0.05); + border: 1px solid var(--color-border); + border-radius: 100px; + font-size: 0.85rem; + color: var(--color-text); + transition: var(--transition-fast); +} + +.skill-tag:hover { + background: rgba(234, 179, 8, 0.1); + border-color: rgba(234, 179, 8, 0.3); + color: var(--color-primary); +} + +@media (max-width: 1024px) { + .skills-grid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (max-width: 768px) { + .skills-grid { + grid-template-columns: 1fr; + } +}