diff --git a/.DS_Store b/.DS_Store
deleted file mode 100644
index 298a1f4..0000000
Binary files a/.DS_Store and /dev/null differ
diff --git a/.gitignore b/.gitignore
index 322d680..016078f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,10 @@
# testing
/coverage
+# private gf site
+/src/app/darecek/
+/public/darecek/
+
# next.js
/.next/
/out/
@@ -19,6 +23,7 @@
# misc
.DS_Store
+/public/DS_Store
*.pem
# debug
diff --git a/README.md b/README.md
index 7b9a5ff..5802434 100644
--- a/README.md
+++ b/README.md
@@ -1,46 +1,19 @@
-# dvorakmortonxd.dev
+# 👾 dvorakmortonxd.dev
-> My personal website — socials, projects, services, and hardware all in one place. Welcome to the goblin cave. >:)
-
-  
-
----
-
-## $ whoami
-
-Hey, I'm **Martin Dvořák** — a 17-year-old IT student based in the Czech Republic, specializing in network management and administration at [sssvt.cz](https://sssvt.cz). I'm a passionate homelabber and developer heavily focused on self-hosting literally everything, writing code, and tinkering with Linux systems and retro hardware.
-
----
-
-## 🌐 Live Site
-
-**[dvorakmortonxd.dev](https://dvorakmortonxd.dev)**
-
----
+> The source code for my own website.
+This repository contains the Next.js frontend for my personal portfolio and link tree, **[dvorakmortonxd.dev](https://dvorakmortonxd.dev)**.
+It's designed with a custom terminal/TUI aesthetic (using the Monocraft font and a Gruvbox-inspired theme) to list out my socials, hardware collections, self-hosted homelab services, and various scattered coding projects.
## 🛠️ Tech Stack
-
-- **Framework:** Next.js (TypeScript)
-- **Styling:** PostCSS / Tailwind
-- **Deployed at:** [dvorakmortonxd.dev](https://dvorakmortonxd.dev)
-
----
-
-## 📁 Project Structure
-
-```
-dvorakmortonxd.dev/
-├── public/ # Static assets (icons, SVGs)
-├── src/ # App source code
-├── next.config.ts
-├── tsconfig.json
-└── postcss.config.mjs
-```
-
----
+
+- **Framework:** Next.js (App Router)
+- **Language:** TypeScript
+- **Styling:** Custom CSS for that retro TUI vibe
## 🚀 Running Locally
+Want to spin it up and check the code out yourself?
+
```bash
git clone https://git.dvorakmortonxd.dev/dvorakmortonxd/dvorakmortonxd.dev
cd dvorakmortonxd.dev
@@ -48,51 +21,14 @@ npm install
npm run dev
```
-Open [http://localhost:3000](http://localhost:3000) in your browser.
+Then open [http://localhost:3000](http://localhost:3000) in your browser.
----
+## 🌍 Deploying?
-## 🖥️ Self-Hosted Services
-
-| Service | Description | Link |
-|---|---|---|
-| Proxmox | Server Management | [proxmox.dvorakmortonxd.dev](https://proxmox.dvorakmortonxd.dev) |
-| Ollama | Local AI Server | [ai.dvorakmortonxd.dev](https://ai.dvorakmortonxd.dev) |
-| Jellyfin | Local Media Server | [jelly.dvorakmortonxd.dev](https://jelly.dvorakmortonxd.dev) |
-| MCSManager | Game Server Panel | [fake-pterodactyl.dvorakmortonxd.dev](https://fake-pterodactyl.dvorakmortonxd.dev) |
-| Navidrome | Music Streaming | [navidrome.dvorakmortonxd.dev](https://navidrome.dvorakmortonxd.dev) |
-| Mailcow | Email Server | [mailcow.dvorakmortonxd.dev](https://mailcow.dvorakmortonxd.dev) |
-| SearxNG | Private Search | [search.dvorakmortonxd.dev](https://search.dvorakmortonxd.dev) |
-| ConvertX | File Converter | [convert.dvorakmortonxd.dev](https://convert.dvorakmortonxd.dev) |
-| GitDXD | Self-hosted Git | [git.dvorakmortonxd.dev](https://git.dvorakmortonxd.dev) |
-
----
-
-## 🧪 Projects
-
-- **[Hospital Execution](https://martin-dv.itch.io/hospital-execution-demo)** — First real game, made in Pygame
-- **[Underbaranoia](https://martin-dv.itch.io/underbaranoia)** — Undertale-like infinite fight simulator in Pygame
-- **[RustyWolf](https://git.dvorakmortonxd.dev/dvorakmortonxd/RustyWolf)** — Lightweight browser written in Rust with WebKitGTK
-- **[dxdwm](https://git.dvorakmortonxd.dev/dvorakmortonxd/dxdwm)** — Small X11 window manager written in Rust
-- **[Venturesome](https://git.dvorakmortonxd.dev/dvorakmortonxd/Venturesome)** — Browser written in Python with PyQtWebEngine
-- **[Mandelbrot Set in Pygame](https://git.dvorakmortonxd.dev/dvorakmortonxd/mandelbrot)** — Pygame Mandelbrot set renderer
-- **[Underpygametale](https://git.dvorakmortonxd.dev/dvorakmortonxd/underpygametale)** — Undertale remake in Pygame
-- **[Batch MSDOS Simulator](https://git.dvorakmortonxd.dev/dvorakmortonxd/DvorakMSDOS)** — Batch OS simulator with games, browser, and surprises
-- **[Offline Memer](https://martin-dv.itch.io/offline-memer)** — Dank Memer parody made in Batch
-- **[Softcraft](https://dvorakmortonxd.dev/softcraft)** — My Minecraft server with a [live BlueMap](https://bluemap.dvorakmortonxd.dev)
-
----
+In order to deploy the website youd want to set up a reverse proxy and something that runs it as a service, me personally, I use cloudflared and pm2.
+you could also use something like vercel but I prefer selfhosting, also please if you want to deploy it,
+you gotta change it enough so that you dont directly copy my website, and also follow the GPL3.0-only license,
+meaning you gotta make your code opensource too
## 📬 Contact
-
-- **Email:** [martin@dvorakmortonxd.dev](mailto:martin@dvorakmortonxd.dev)
-- **Instagram:** [@dvorakmortonxd](https://www.instagram.com/dvorakmortonxd/)
-- **LinkedIn:** [Martin Dvořák](https://www.linkedin.com/in/martin-dvorak-32012a394/)
-- **Discord:** [dvorakmortonxd](https://discord.com/users/555745543763001364)
-- **Itch.io:** [martin-dv.itch.io](https://martin-dv.itch.io)
-
----
-
-## 📄 License
-
-© 2025–2026 Martin Dvořák. All rights reserved (not really, I don't care).
\ No newline at end of file
+To see my projects or get in touch, visit the live site or email me at [martin@dvorakmortonxd.dev](mailto:martin@dvorakmortonxd.dev).
diff --git a/public/Monocraft-Bold.ttf b/public/Monocraft-Bold.ttf
new file mode 100644
index 0000000..9f5ac0b
Binary files /dev/null and b/public/Monocraft-Bold.ttf differ
diff --git a/public/Monocraft-Italic.ttf b/public/Monocraft-Italic.ttf
new file mode 100644
index 0000000..9c14ce4
Binary files /dev/null and b/public/Monocraft-Italic.ttf differ
diff --git a/public/Monocraft.ttf b/public/Monocraft.ttf
new file mode 100644
index 0000000..4f65eb9
Binary files /dev/null and b/public/Monocraft.ttf differ
diff --git a/public/RustyWolfPreview.webp b/public/RustyWolfPreview.webp
new file mode 100644
index 0000000..e386f2f
Binary files /dev/null and b/public/RustyWolfPreview.webp differ
diff --git a/public/asuslaptop.webp b/public/asuslaptop.webp
new file mode 100644
index 0000000..b1188ca
Binary files /dev/null and b/public/asuslaptop.webp differ
diff --git a/public/bench.svg b/public/bench.svg
new file mode 100644
index 0000000..22ed036
--- /dev/null
+++ b/public/bench.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/bukovina.svg b/public/bukovina.svg
new file mode 100644
index 0000000..626de2d
--- /dev/null
+++ b/public/bukovina.svg
@@ -0,0 +1,4626 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/coding-1.jpg b/public/coding-1.jpg
new file mode 100644
index 0000000..857a5e2
Binary files /dev/null and b/public/coding-1.jpg differ
diff --git a/public/coding-1.webp b/public/coding-1.webp
new file mode 100644
index 0000000..ac3b508
Binary files /dev/null and b/public/coding-1.webp differ
diff --git a/public/coding-10.webp b/public/coding-10.webp
new file mode 100644
index 0000000..d27f9f6
Binary files /dev/null and b/public/coding-10.webp differ
diff --git a/public/coding-11.webp b/public/coding-11.webp
new file mode 100644
index 0000000..c4a55fd
Binary files /dev/null and b/public/coding-11.webp differ
diff --git a/public/coding-12.webp b/public/coding-12.webp
new file mode 100644
index 0000000..ce0b0f5
Binary files /dev/null and b/public/coding-12.webp differ
diff --git a/public/coding-13.webp b/public/coding-13.webp
new file mode 100644
index 0000000..c3703f7
Binary files /dev/null and b/public/coding-13.webp differ
diff --git a/public/coding-14.webp b/public/coding-14.webp
new file mode 100644
index 0000000..a1d076b
Binary files /dev/null and b/public/coding-14.webp differ
diff --git a/public/coding-15.webp b/public/coding-15.webp
new file mode 100644
index 0000000..d5cb6c2
Binary files /dev/null and b/public/coding-15.webp differ
diff --git a/public/coding-16.webp b/public/coding-16.webp
new file mode 100644
index 0000000..6aeb196
Binary files /dev/null and b/public/coding-16.webp differ
diff --git a/public/coding-17.webp b/public/coding-17.webp
new file mode 100644
index 0000000..7398919
Binary files /dev/null and b/public/coding-17.webp differ
diff --git a/public/coding-2.webp b/public/coding-2.webp
new file mode 100644
index 0000000..d2d92ed
Binary files /dev/null and b/public/coding-2.webp differ
diff --git a/public/coding-3.webp b/public/coding-3.webp
new file mode 100644
index 0000000..d9c275d
Binary files /dev/null and b/public/coding-3.webp differ
diff --git a/public/coding-4.webp b/public/coding-4.webp
new file mode 100644
index 0000000..9240eaf
Binary files /dev/null and b/public/coding-4.webp differ
diff --git a/public/coding-5.webp b/public/coding-5.webp
new file mode 100644
index 0000000..3dced66
Binary files /dev/null and b/public/coding-5.webp differ
diff --git a/public/coding-6.webp b/public/coding-6.webp
new file mode 100644
index 0000000..365fa18
Binary files /dev/null and b/public/coding-6.webp differ
diff --git a/public/coding-7.webp b/public/coding-7.webp
new file mode 100644
index 0000000..cdb74eb
Binary files /dev/null and b/public/coding-7.webp differ
diff --git a/public/coding-8.webp b/public/coding-8.webp
new file mode 100644
index 0000000..a0ed0e6
Binary files /dev/null and b/public/coding-8.webp differ
diff --git a/public/coding-9.webp b/public/coding-9.webp
new file mode 100644
index 0000000..815a69c
Binary files /dev/null and b/public/coding-9.webp differ
diff --git a/public/deadlift.svg b/public/deadlift.svg
new file mode 100644
index 0000000..86fad37
--- /dev/null
+++ b/public/deadlift.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/dirt.webp b/public/dirt.webp
new file mode 100644
index 0000000..ee626fc
Binary files /dev/null and b/public/dirt.webp differ
diff --git a/public/discord.svg b/public/discord.svg
new file mode 100644
index 0000000..6412c05
--- /dev/null
+++ b/public/discord.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/gentoo-setup.webp b/public/gentoo-setup.webp
new file mode 100644
index 0000000..8f46cad
Binary files /dev/null and b/public/gentoo-setup.webp differ
diff --git a/public/gitdxd.webp b/public/gitdxd.webp
new file mode 100644
index 0000000..e15cc9b
Binary files /dev/null and b/public/gitdxd.webp differ
diff --git a/public/github.svg b/public/github.svg
new file mode 100644
index 0000000..6e125b6
--- /dev/null
+++ b/public/github.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/gruvbox.webp b/public/gruvbox.webp
new file mode 100644
index 0000000..f4fe2d8
Binary files /dev/null and b/public/gruvbox.webp differ
diff --git a/public/instagram.svg b/public/instagram.svg
new file mode 100644
index 0000000..89cebf4
--- /dev/null
+++ b/public/instagram.svg
@@ -0,0 +1,24 @@
+
+
+
+
+ Instagram-color
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/iphone-7.webp b/public/iphone-7.webp
new file mode 100644
index 0000000..f55be41
Binary files /dev/null and b/public/iphone-7.webp differ
diff --git a/public/iphone11.webp b/public/iphone11.webp
new file mode 100644
index 0000000..0bdf130
Binary files /dev/null and b/public/iphone11.webp differ
diff --git a/public/iphone16pro.webp b/public/iphone16pro.webp
new file mode 100644
index 0000000..e5d03d4
Binary files /dev/null and b/public/iphone16pro.webp differ
diff --git a/public/itchio.svg b/public/itchio.svg
new file mode 100644
index 0000000..c43588a
--- /dev/null
+++ b/public/itchio.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/public/joker.webp b/public/joker.webp
new file mode 100644
index 0000000..76b70dd
Binary files /dev/null and b/public/joker.webp differ
diff --git a/public/linkedin.svg b/public/linkedin.svg
new file mode 100644
index 0000000..3ff3fee
--- /dev/null
+++ b/public/linkedin.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/public/llms.txt b/public/llms.txt
new file mode 100644
index 0000000..0b60cdf
--- /dev/null
+++ b/public/llms.txt
@@ -0,0 +1,117 @@
+# dvorakmortonxd.dev
+
+> Personal website of Martin Dvořák (dvorakmortonxd), a Czech developer, homelab enthusiast, and self-hoster based in the Czech Republic. The site serves as a hub for his social media, self-hosted services, hardware collection, coding projects, and friends.
+
+## Author
+
+- Name: Martin Dvořák
+- Alias: dvorakmortonxd
+- Role: Developer, homelab enthusiast, self-hoster, IT Student at sssvt.cz
+- Location: Czech Republic
+- Contact: dvorak@dvorakmortonxd.dev, or see social links below
+- Free time: Spending time with girlfriend, playing Terraria and Minecraft modpacks with Mekanism
+
+## Socials
+
+- Instagram (main): https://www.instagram.com/dvorakmortonxd/
+- Instagram (gym): https://www.instagram.com/dvorakmortonxd2/
+- SoundCloud: https://soundcloud.com/martin-dvorak-185636305
+- TikTok: https://www.tiktok.com/@dvorakmortonxd
+- Snapchat: https://www.snapchat.com/add/dvorakmortonxd
+- GitHub: https://github.com/dvorakmortonxd
+- LinkedIn: https://www.linkedin.com/in/martin-dvorak-32012a394/
+- Itch.io: https://martin-dv.itch.io
+- Discord: https://discord.com/users/555745543763001364
+- Reddit: https://www.reddit.com/user/M4RT1NYT/
+- Twitter/X: https://x.com/pepicskopcecek
+- Quipee: https://quipee.me/dvorakmortonxd
+
+## Self-Hosted Services
+
+Martin runs a personal Proxmox homelab server and self-hosts the following services:
+
+- Proxmox (server management): https://proxmox.dvorakmortonxd.dev/
+- Ollama (local AI inference with RTX 3070 GPU passthrough): https://ai.dvorakmortonxd.dev/
+- Jellyfin (local media server): https://jelly.dvorakmortonxd.dev/
+- MCSManager (game server panel): https://fake-pterodactyl.dvorakmortonxd.dev/
+- Navidrome (music streaming): https://navidrome.dvorakmortonxd.dev/
+- Mailcow (email server): https://mailcow.dvorakmortonxd.dev/
+- SearxNG (private search): https://search.dvorakmortonxd.dev/
+- ConvertX (file converter): https://convert.dvorakmortonxd.dev/
+
+## Hardware
+
+### Main Desktop — Gentoo Linux
+- CPU: AMD Ryzen 5 3600 (6c/12t)
+- GPU: NVIDIA GTX 1050 Ti
+- RAM: 16GB
+- Storage: 240GB SSD
+- OS: Gentoo Linux
+
+### Proxmox Homelab Server
+- CPU: Intel Xeon E5 2680 v4 (14c/28t)
+- GPU: NVIDIA RTX 3070 (used for local AI via Ollama)
+- RAM: 68GB DDR4 RDIMM (2×16GB + 1×32GB + 1×4GB)
+- Storage: 256GB SATA M.2 + 1TB HDD + 750GB HDD
+- Note: Available for VPS/hosting (DM on Instagram)
+
+### Laptops
+- MacBook Air M4 13" — Apple M4 (10c CPU / 8c GPU), 16GB unified RAM (LPDDR5X), 256GB storage. Main daily driver for everything except gaming.
+- MacBook Air 2013 11" — Intel Core i5 (2c/4t), 8GB DDR3, 250GB SSD. Runs Arch Linux with i3-gaps (given to Josef).
+- MacBook Unibody 2010 — Non-functional (purchased faulty for €15 on bazos).
+- ThinkPad T400s 14" (2009) — Intel Core 2 Duo (2c/2t), 8GB DDR3, 800GB HDD. Runs Void Linux + i3wm. Intel AMT disabled.
+- Asus N56JR 15.6" — Intel Core i7 4700HQ (4c/8t), 8GB DDR3, 240GB SSD. Runs Ubuntu 24.04 LTS (mom uses it for movies).
+
+### Phones
+- iPhone 16 Pro 128GB — Apple A18 Pro (6c/6t), 8GB RAM. Current main phone.
+- iPhone 11 128GB — Apple A13 (6c/6t), 4GB RAM. Now used by father.
+- iPhone 7 128GB — Apple A10 (4c/4t), 2GB RAM. Purchased for ~€4 on refurbed.cz.
+
+### Gaming
+- Xbox 360 S — Trinity motherboard, modified with badupdate exploit for custom software. XCGPU (3c/6t), 0.5GB GDDR3, 500GB HDD.
+- Xbox One S 2TB — Owned since ~2018 or 2019, used sometimes for Minecraft console edition gliding minigame.
+
+## Coding Projects
+
+### Games
+- Hospital Execution — First real game, made in Pygame. https://martin-dv.itch.io/hospital-execution-demo
+- Underbaranoia — Undertale-like infinite fight simulator, made in Pygame. https://martin-dv.itch.io/underbaranoia
+- Swords and Sandals 2 Pygame Remake — Unfinished remake of the classic flash game (will finish it one day). https://github.com/dvorakmortonxd/sas2py
+- Underpygametale — Remake of Undertale written in Pygame. https://github.com/dvorakmortonxd/underpygametale
+
+### Tools & Utilities
+- Offline Memer — Parody of the Discord bot "Dank Memer", made in Batch (first published game). https://martin-dv.itch.io/offline-memer
+- 4y — Rebranded fork of Ly (Linux login manager), no extra features. Outdated. https://github.com/dvorakmortonxd/4y
+- 4rch Linux — Rebranded fork of Arch Linux with the Calamares installer. Outdated. https://github.com/dvorakmortonxd/4rch-linux
+- You_Are_An_Idiot_Virus.py — Python script spamming blinking windows as a prank. https://github.com/dvorakmortonxd/You_Are_An_Idiot_Virus
+- Batch MSDOS Simulator — School project, OS simulator with browser, games, and photos in Batch. https://github.com/dvorakmortonxd/DvorakMSDOS
+
+### Browsers
+- Venturesome — Browser built in Python using PyQtWebEngine with PyQt5. Superseded by RustyWolf. https://github.com/dvorakmortonxd/Venturesome
+- RustyWolf — Lightweight browser built in Rust with WebKitGTK. Successor to Venturesome. https://github.com/dvorakmortonxd/RustyWolf
+
+### Window Manager
+- dxdwm — Minimal X11 window manager written in Rust. https://github.com/dvorakmortonxd/DvorakMSDOS
+
+### Minecraft
+- MMO Minecraft Plugin — Basic MMO plugin with custom bosses and items done manually. https://www.youtube.com/watch?v=cSAX5Ds61ac
+- Various Minecraft servers — Creative Games, Softcraft, Frostville, EuSMP, EurthSMP, SoftSMP, etc. https://discord.gg/KtHRm9kRmy
+
+### Other
+- PYGETEX — Discord bots collection. (Including a self-bot that auto-advertised a minecraft server). https://github.com/dvorakmortonxd/PYGETEX
+- Ollama Server — Local AI server VM running on Proxmox with RTX 3070 GPU passthrough. https://ai.dvorakmortonxd.dev/
+- Mandelbrot Set in Pygame — Python script rendering the Mandelbrot set. https://github.com/dvorakmortonxd/mandelbrot
+- Proxmox Setup — Proxmox setup with over 8 VMs running all local services. https://proxmox.dvorakmortonxd.dev/
+
+## Friends
+
+- Josef Skopec: https://skopec.dev/
+- Filip Bukovina: https://bukovinafilip.com/
+- Tomáš Vlk: https://vlcak.me
+
+## Content Policy
+
+- Personal website, not a commercial entity.
+- Content may be referenced with attribution.
+- Self-hosted services are personal and not intended for public use unless stated.
+- The Proxmox server is available for VPS/hosting on request (contact via Instagram).
\ No newline at end of file
diff --git a/public/macbook-air-11.webp b/public/macbook-air-11.webp
new file mode 100644
index 0000000..7add89f
Binary files /dev/null and b/public/macbook-air-11.webp differ
diff --git a/public/macbook-air.webp b/public/macbook-air.webp
new file mode 100644
index 0000000..bbbf6ec
Binary files /dev/null and b/public/macbook-air.webp differ
diff --git a/public/macbook2010.webp b/public/macbook2010.webp
new file mode 100644
index 0000000..3c62efa
Binary files /dev/null and b/public/macbook2010.webp differ
diff --git a/public/minecrafttest2.webp b/public/minecrafttest2.webp
new file mode 100644
index 0000000..e976763
Binary files /dev/null and b/public/minecrafttest2.webp differ
diff --git a/public/proxmox-server.webp b/public/proxmox-server.webp
new file mode 100644
index 0000000..5513b72
Binary files /dev/null and b/public/proxmox-server.webp differ
diff --git a/public/proxmox.webp b/public/proxmox.webp
new file mode 100644
index 0000000..fde42d8
Binary files /dev/null and b/public/proxmox.webp differ
diff --git a/public/quip.svg b/public/quip.svg
new file mode 100644
index 0000000..8dae6b3
--- /dev/null
+++ b/public/quip.svg
@@ -0,0 +1,295 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/quipee.webp b/public/quipee.webp
new file mode 100644
index 0000000..c861c34
Binary files /dev/null and b/public/quipee.webp differ
diff --git a/public/reddit.svg b/public/reddit.svg
new file mode 100644
index 0000000..e9a2ee1
--- /dev/null
+++ b/public/reddit.svg
@@ -0,0 +1,17 @@
+
+
+
+
+ Reddit-color
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..63a9182
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,57 @@
+# robots.txt for dvorakmortonxd.dev
+# https://dvorakmortonxd.dev
+
+# General crawlers — allow main site, block self-hosted services
+User-agent: *
+Allow: /
+Allow: /llms.txt
+Allow: /llms-full.txt
+Disallow: /api/
+Disallow: /_next/
+Disallow: /admin/
+Disallow: /darecek/
+
+# AI training crawlers
+User-agent: GPTBot
+Allow: /
+
+User-agent: anthropic-ai
+Allow: /
+
+User-agent: Claude-Web
+Allow: /
+
+# Meta bots — not welcome
+User-agent: FacebookBot
+Disallow: /
+
+User-agent: meta-externalagent
+Disallow: /
+
+User-agent: meta-externalfetcher
+Disallow: /
+
+# Search engine crawlers — welcome
+User-agent: Googlebot
+Allow: /
+
+User-agent: Bingbot
+Allow: /
+
+User-agent: DuckDuckBot
+Allow: /
+
+User-agent: Slurp
+Allow: /
+
+User-agent: Baiduspider
+Allow: /
+
+# Sitemap and Llms
+Sitemap: https://dvorakmortonxd.dev/sitemap.xml
+LLMs: https://dvorakmortonxd.dev/llms.txt
+
+# ===========================================
+# 🎮 Have a great day, crawler!
+# Check out my projects at dvorakmortonxd.dev
+# ===========================================
diff --git a/public/sitemap.xml b/public/sitemap.xml
new file mode 100644
index 0000000..d55cd80
--- /dev/null
+++ b/public/sitemap.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+ https://dvorakmortonxd.dev/
+ 2026-04-14
+ monthly
+ 1.0
+
+
+
+
+ https://dvorakmortonxd.dev/llms.txt
+ 2026-04-14
+ monthly
+ 0.5
+
+
+
+
+ https://proxmox.dvorakmortonxd.dev/
+ 2026-04-14
+ yearly
+ 0.4
+
+
+ https://ai.dvorakmortonxd.dev/
+ 2026-04-14
+ yearly
+ 0.4
+
+
+ https://jelly.dvorakmortonxd.dev/
+ 2026-04-14
+ yearly
+ 0.4
+
+
+ https://fake-pterodactyl.dvorakmortonxd.dev/
+ 2026-04-14
+ yearly
+ 0.3
+
+
+ https://navidrome.dvorakmortonxd.dev/
+ 2026-04-14
+ yearly
+ 0.4
+
+
+ https://mailcow.dvorakmortonxd.dev/
+ 2026-04-14
+ yearly
+ 0.3
+
+
+ https://search.dvorakmortonxd.dev/
+ 2026-04-14
+ yearly
+ 0.3
+
+
+ https://convert.dvorakmortonxd.dev/
+ 2026-04-14
+ yearly
+ 0.3
+
+
+
\ No newline at end of file
diff --git a/public/skopec-fr.html b/public/skopec-fr.html
new file mode 100644
index 0000000..c4cf4e8
--- /dev/null
+++ b/public/skopec-fr.html
@@ -0,0 +1,727 @@
+
+
+
+
+
+ Friends' Websites | Josef
+
+
+
+
+
+
+
+
+
+
+
+
Friends' Websites
+
Friends' Websites
+
Clean live previews of sites I want to keep nearby, with quick one-click access to each full page.
+
+ 2 sites
+ Live preview
+ Fast access
+
+
+
+
+
+ Martin Dvořák
+ dvorakmortonxd.dev
+
+
+ Filip Bukovina
+ bukovinafilip.com
+
+
+
+
+
+
+
+
+
+
Web previews
+
The previews below help you quickly see what each site looks like without leaving this page.
+
+
+
+
+
+
+ Preview
+ Martin Dvořák
+
+
+
+
+
+
+
+
+
+ Preview
+ Filip Bukovina
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/skopec.html b/public/skopec.html
new file mode 100644
index 0000000..2e87ac1
--- /dev/null
+++ b/public/skopec.html
@@ -0,0 +1,830 @@
+
+
+
+
+
+ Josef - IT STUDENT & DEVELOPER
+
+
+
+
+
+
+
+
+
+
+
+ Hi, I'm Josef
+ Tech Enthusiast | Student | Developer | Linux Lover
+ ⚙️ This website is under construction - not final results yet, that's why it maybe looks weird
+
+ AI
+ Retro Computing
+ Simple Tech Projects
+ Fitness
+
+
+
+
+
+ About Me
+
+
+
Welcome! 👋
+
Hey, I'm Josef. I study IT at a Private Secondary School of Information Technology, and most of the time I'm messing around with tech.
+
I'm really into AI, old PCs, Linux, and building random projects just to see how things work.
+
+
+
+
+
🤖 AI
+
Exploring artificial intelligence and AI applications
+
+
+
💻 Retro Tech
+
Fascinated by vintage computers and their engineering
+
+
+
🐧 Linux
+
I use Arch btw 🥹
+
+
+
⚙️ Building
+
Creating projects and learning through hands-on development
+
+
+
💪 Fitness
+
Regular gym enthusiast balancing tech life with hitting the gym
+
+
+
🔫 Airsoft
+
Playing airsoft since 2023
+
+
+
+
+
+
+
+
+ My Projects
+
+
+
🐍
+
+
Complex Snake (Pygame)
+
Advanced Snake game built in Python with Pygame, featuring dynamic difficulty, obstacles, power-ups, score multipliers, and smooth grid-based movement.
+
+ Python
+ Pygame
+ Game Dev
+ OOP
+
+
+
+
+
+
+
+
+ Hardware
+
+ Main Desktop PC
+
+
+
Build / System
+
Custom PC (2022) - Arch Linux with modified Zen kernel
+
+
+
CPU
+
AMD Ryzen 5 5600
+
+
+
GPU
+
AMD Radeon RX 6700
+
+
+
RAM
+
KINGSTON FURY BEAST 16 GB DDR4 3200MHZ (RGB)
+
+
+
Storage
+
1TB M.2 NVMe SSD (WD)
+
+
+
Motherboard
+
ASUS TUF B550-Plus
+
+
+
PSU
+
600W SilentiumPC
+
+
+
CPU Cooler
+
SilentiumPC Fera 5
+
+
+
Case
+
SilentiumPC PC Case
+
+
+
+ Laptop
+
+
+
Model / Year
+
MacBook Air 11" (Mid 2013) - Arch Linux with LTS kernel and SWAY/KDE plasma desktop
+
+
+
CPU
+
Intel Core i5-4250U (1.3 GHz, Turbo up to 2.6 GHz)
+
+
+
GPU
+
Intel HD Graphics 5000
+
+
+
RAM
+
8 GB LPDDR3 1600 MHz
+
+
+
Storage
+
256 GB PCIe SSD
+
+
+
Display
+
11.6", 1366x768
+
+
+
Wireless
+
Wi-Fi 802.11ac, Bluetooth 4.0
+
+
+
+ Phone
+
+
+
Model / System
+
Xiaomi Redmi Note 11 Pro 5G - Android (HyperOS) - I am planning to root it
+
+
+
Display
+
6.67" AMOLED, 120 Hz, FHD+ (2400x1080)
+
+
+
Chipset
+
Qualcomm Snapdragon 695 5G (6 nm)
+
+
+
+
Storage
+
128 GB UFS 2.2 + microSD slot
+
+
+
Battery
+
5000 mAh, 67 W turbo charging
+
+
+
Main Camera
+
108 MP + 8 MP ultrawide + 2 MP macro
+
+
+
Connectivity
+
5G, NFC, Wi-Fi 5, Bluetooth 5.1, USB-C
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/skopec.svg b/public/skopec.svg
new file mode 100644
index 0000000..3eff199
--- /dev/null
+++ b/public/skopec.svg
@@ -0,0 +1,9125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/snapchat.svg b/public/snapchat.svg
new file mode 100644
index 0000000..f2a9eb8
--- /dev/null
+++ b/public/snapchat.svg
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/softcraft.webp b/public/softcraft.webp
new file mode 100644
index 0000000..216f4d9
Binary files /dev/null and b/public/softcraft.webp differ
diff --git a/public/soundcloud.svg b/public/soundcloud.svg
new file mode 100644
index 0000000..d5f416c
--- /dev/null
+++ b/public/soundcloud.svg
@@ -0,0 +1,17 @@
+
+
+
+
+ Soundcloud-color
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/squat.svg b/public/squat.svg
new file mode 100644
index 0000000..4b08285
--- /dev/null
+++ b/public/squat.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/thinkpadt400s.webp b/public/thinkpadt400s.webp
new file mode 100644
index 0000000..4f42ec3
Binary files /dev/null and b/public/thinkpadt400s.webp differ
diff --git a/public/tiktok.svg b/public/tiktok.svg
new file mode 100644
index 0000000..a162b21
--- /dev/null
+++ b/public/tiktok.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/twitter.svg b/public/twitter.svg
new file mode 100644
index 0000000..0a53c72
--- /dev/null
+++ b/public/twitter.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/public/vlcak.svg b/public/vlcak.svg
new file mode 100644
index 0000000..2223d79
--- /dev/null
+++ b/public/vlcak.svg
@@ -0,0 +1,5992 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/xbox360.webp b/public/xbox360.webp
new file mode 100644
index 0000000..e6de84d
Binary files /dev/null and b/public/xbox360.webp differ
diff --git a/public/xboxones.webp b/public/xboxones.webp
new file mode 100644
index 0000000..0b3aa9f
Binary files /dev/null and b/public/xboxones.webp differ
diff --git a/src/app/api/activities/route.ts b/src/app/api/activities/route.ts
new file mode 100644
index 0000000..ac09b43
--- /dev/null
+++ b/src/app/api/activities/route.ts
@@ -0,0 +1,9 @@
+export async function GET() {
+ try {
+ const res = await fetch("https://git.dvorakmortonxd.dev/api/v1/users/dvorakmortonxd/activities/feeds?limit=20");
+ const data = await res.json();
+ return Response.json(data);
+ } catch {
+ return Response.json({ error: "failed to load" }, { status: 500 });
+ }
+}
diff --git a/src/app/api/heatmap/route.ts b/src/app/api/heatmap/route.ts
new file mode 100644
index 0000000..14189bc
--- /dev/null
+++ b/src/app/api/heatmap/route.ts
@@ -0,0 +1,5 @@
+export async function GET() {
+ const res = await fetch("https://git.dvorakmortonxd.dev/api/v1/users/dvorakmortonxd/heatmap");
+ const data = await res.json();
+ return Response.json(data);
+}
\ No newline at end of file
diff --git a/src/app/components/ContributionHeatmap.tsx b/src/app/components/ContributionHeatmap.tsx
new file mode 100644
index 0000000..ddfb5ed
--- /dev/null
+++ b/src/app/components/ContributionHeatmap.tsx
@@ -0,0 +1,207 @@
+"use client";
+
+import React, { useEffect, useState } from "react";
+
+interface HeatmapData {
+ timestamp: number;
+ contributions: number;
+}
+
+interface Activity {
+ op_type: string;
+ content?: string | null;
+ created: string;
+ repo?: {
+ full_name?: string;
+ };
+}
+
+interface ActivityPayload {
+ Commits?: Array<{
+ Message?: string;
+ }>;
+ HeadCommit?: {
+ Message?: string;
+ };
+}
+
+export default function ContributionHeatmap() {
+ const [weeks, setWeeks] = useState<{ date: string; contribs: number; level: number }[][]>([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(false);
+ const [totalContribs, setTotalContribs] = useState(0);
+ const [activities, setActivities] = useState([]);
+ const [hoveredCell, setHoveredCell] = useState<{ date: string; contribs: number } | null>(null);
+
+ useEffect(() => {
+ async function fetchHeatmap() {
+ try {
+ const res = await fetch("/api/heatmap");
+ if (!res.ok) {
+ throw new Error("Failed to fetch");
+ }
+ const data: HeatmapData[] = await res.json();
+ const map = new Map();
+ let total = 0;
+ let maxContribs = 0;
+ data.forEach((item) => {
+ const d = new Date(item.timestamp * 1000);
+ const dateStr = d.getFullYear() + "-" + String(d.getMonth() + 1).padStart(2, "0") + "-" + String(d.getDate()).padStart(2, "0");
+ const currentDayTotal = (map.get(dateStr) || 0) + item.contributions;
+ map.set(dateStr, currentDayTotal);
+ if (currentDayTotal > maxContribs) maxContribs = currentDayTotal;
+ total += item.contributions;
+ });
+
+ const endDate = new Date();
+ endDate.setHours(0, 0, 0, 0);
+ const startDate = new Date(endDate);
+ startDate.setFullYear(startDate.getFullYear() - 1);
+ startDate.setDate(startDate.getDate() - startDate.getDay());
+
+ const newWeeks = [];
+ let currentWeek = [];
+
+ for (let d = new Date(startDate); d <= endDate; d.setDate(d.getDate() + 1)) {
+ const dateStr = d.getFullYear() + "-" + String(d.getMonth() + 1).padStart(2, "0") + "-" + String(d.getDate()).padStart(2, "0");
+ const contribs = map.get(dateStr) || 0;
+
+ let level = 0;
+ if (contribs > 0) {
+ level = 1;
+ if (contribs > maxContribs * 0.25) level = 2;
+ if (contribs > maxContribs * 0.5) level = 3;
+ if (contribs > maxContribs * 0.75) level = 4;
+ }
+
+ currentWeek.push({ date: dateStr, contribs, level });
+
+ if (currentWeek.length === 7) {
+ newWeeks.push(currentWeek);
+ currentWeek = [];
+ }
+ }
+ if (currentWeek.length > 0) {
+ while (currentWeek.length < 7) {
+ currentWeek.push({ date: "", contribs: -1, level: -1 });
+ }
+ newWeeks.push(currentWeek);
+ }
+
+ setWeeks(newWeeks);
+ setTotalContribs(total);
+ setLoading(false);
+ } catch (err) {
+ console.error("Failed to load heatmap:", err);
+ setError(true);
+ setLoading(false);
+ }
+ }
+
+ async function fetchActivities() {
+ try {
+ const res = await fetch("/api/activities");
+ if (res.ok) {
+ const data: Activity[] = await res.json();
+ // Filter to just standard push/commit events
+ const valid = data.filter((d) => d.op_type === "commit_repo" || d.op_type === "push_repo").slice(0, 3);
+ setActivities(valid);
+ }
+ } catch (err) {
+ console.error("Failed to load activities:", err);
+ }
+ }
+
+ fetchHeatmap();
+ fetchActivities();
+ }, []);
+
+ if (loading) {
+ return Loading contributions...
;
+ }
+
+ if (error) {
+ return Failed to load contributions.
;
+ }
+
+ return (
+
+
+
+ martin@git.dvorakmortonxd.dev :~ $ echo "{totalContribs} contributions in the last year"
+
+
+
+ {weeks.map((week, wIdx) => (
+
+ {week.map((day, dIdx) => (
+
= 0 ? day.level : undefined}
+ style={{ visibility: day.level === -1 ? "hidden" : "visible" }}
+ title={day.level >= 0 ? `${day.contribs} contributions on ${day.date}` : undefined}
+ onMouseEnter={() => day.level >= 0 && setHoveredCell({ date: day.date, contribs: day.contribs })}
+ onMouseLeave={() => setHoveredCell(null)}
+ >
+
+ ))}
+
+ ))}
+
+
+
+ {hoveredCell ? (
+ {hoveredCell.contribs} contributions on {hoveredCell.date}
+ ) : (
+ Hover over a day to see contributions
+ )}
+
+
+
Less
+
+
+
+
+
+
More
+
+
+
+ {activities.length > 0 && (
+
+
+ martin@git.dvorakmortonxd.dev :~ $ git log -n 3 #displays my 3 latest contributions
+
+ {activities.map((act, idx) => {
+ let msg = "No message";
+ try {
+ if (act.content) {
+ const parsed = JSON.parse(act.content) as ActivityPayload;
+ if (parsed.Commits && parsed.Commits.length > 0) {
+ msg = parsed.Commits[0].Message?.split("\n")[0] ?? msg;
+ } else if (parsed.HeadCommit?.Message) {
+ msg = parsed.HeadCommit.Message.split("\n")[0];
+ }
+ }
+ } catch {}
+
+ return (
+
+
+ repo: {act.repo?.full_name || "unknown"}
+
+ {new Date(act.created).toLocaleDateString()}-{new Date(act.created).toLocaleTimeString()}
+
+
+
+ {msg}
+
+
+ );
+ })}
+
+ )}
+
+ );
+}
diff --git a/src/app/components/JokerLogo.tsx b/src/app/components/JokerLogo.tsx
index 0c7aac3..6fc0abd 100644
--- a/src/app/components/JokerLogo.tsx
+++ b/src/app/components/JokerLogo.tsx
@@ -27,7 +27,7 @@ export default function JokerLogo() {
/>
{jokerActive && (
-
+
)}
>
diff --git a/src/app/components/SlBackground.tsx b/src/app/components/SlBackground.tsx
index 8e3facd..20a8f8b 100644
--- a/src/app/components/SlBackground.tsx
+++ b/src/app/components/SlBackground.tsx
@@ -4,14 +4,14 @@ import { useEffect, useState } from "react";
const TRAIN_ASCII = ` ==== ________ ___________
_D _| |_______/ \\__I_I_____===__|_________|
- |(_)--- | H\\________/ | | =|___ ___| _________________ _________________ _________________
- / | | H | | | | ||_| |_|| _| \\_____| \\_____| \\_____A
- | | | H |__--------------------| [___] | =| | | |
- | ________|___H__/__|_____/[][]~\\_______| | -| | | |
- |/ | |-----------I_____I [][] [] D |=======|____|________________________|_______________________|_______________________|_
-__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__|__________________________|_______________________|_______________________|
- |/-=|___|= || || || |_____/~\\___/ |_D__D__D_| |_D__D__D_| |_D__D__D_| |_D__D__D_| |_D__D__D_| |_D__D__D_|
- \\_/ \\O=====O=====O=====O_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/`;
+ |(_)--- | H\\________/ | | =|___ ___| _________________ _________________ _________________ _________________ _________________ _________________
+ / | | H | | | | ||_| |_|| _| \\_____| \\_____| \\_____| \\_____| \\_____| \\_____A
+ | | | H |__--------------------| [___] | =| | | | | | |
+ | ________|___H__/__|_____/[][]~\\_______| | -| | | | | | |
+ |/ | |-----------I_____I [][] [] D |=======|____|________________________|_______________________|_______________________|_______________________|_______________________|_______________________|_
+__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__|__________________________|_______________________|_______________________|_______________________|_______________________|_______________________|
+ |/-=|___|= || || || |_____/~\\___/ |_D__D__D_| |_D__D__D_| |_D__D__D_| |_D__D__D_| |_D__D__D_| |_D__D__D_| |_D__D__D_| |_D__D__D_| |_D__D__D_| |_D__D__D_| |_D__D__D_| |_D__D__D_|
+ \\_/ \\O=====O=====O=====O_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/`;
export default function SlBackground() {
const [pos, setPos] = useState(150);
@@ -25,7 +25,7 @@ export default function SlBackground() {
const delta = timestamp - lastTime;
// Update position every ~30ms to create a retro sliding terminal refresh feel
- if (delta > 30) {
+ if (delta > 45) {
setPos((prev) => {
if (prev <= -150) return 150;
return prev - 1.5;
@@ -65,7 +65,7 @@ export default function SlBackground() {
paddingBottom: "5vh",
justifyContent: "center",
userSelect: "none",
- backgroundImage: "linear-gradient(rgba(29, 32, 33, 0.94), rgba(29, 32, 33, 0.94)), url('/gruvbox.png')",
+ backgroundImage: "linear-gradient(rgba(29, 32, 33, 0.94), rgba(29, 32, 33, 0.94)), url('/gruvbox.webp')",
backgroundSize: "cover",
backgroundPosition: "center",
}}
diff --git a/src/app/darecek/darecek.css b/src/app/darecek/darecek.css
deleted file mode 100644
index 3a0750f..0000000
--- a/src/app/darecek/darecek.css
+++ /dev/null
@@ -1,710 +0,0 @@
-/* Valentine's Page for Kiki */
-
-.kiki-container {
- min-height: 100vh;
- width: 100%;
- background: linear-gradient(
- 135deg,
- #1a1a2e 0%,
- #16213e 25%,
- #1a1a2e 50%,
- #2d132c 75%,
- #1a1a2e 100%
- );
- background-size: 400% 400%;
- animation: gradientBG 15s ease infinite;
- position: relative;
- overflow: hidden;
- font-family: "Inter", "Segoe UI", system-ui, sans-serif;
-}
-
-@keyframes gradientBG {
- 0% { background-position: 0% 50%; }
- 50% { background-position: 100% 50%; }
- 100% { background-position: 0% 50%; }
-}
-
-/* Floating Hearts */
-.hearts-container {
- position: fixed;
- inset: 0;
- pointer-events: none;
- overflow: hidden;
- z-index: 1;
-}
-
-.floating-heart {
- position: absolute;
- bottom: -50px;
- animation: floatUp linear infinite;
- opacity: 0.7;
- filter: drop-shadow(0 0 10px rgba(255, 105, 180, 0.5));
-}
-
-@keyframes floatUp {
- 0% {
- transform: translateY(0) rotate(0deg) scale(1);
- opacity: 0;
- }
- 10% {
- opacity: 0.7;
- }
- 90% {
- opacity: 0.7;
- }
- 100% {
- transform: translateY(-110vh) rotate(720deg) scale(0.5);
- opacity: 0;
- }
-}
-
-/* Sparkles */
-.sparkles {
- position: fixed;
- inset: 0;
- pointer-events: none;
- z-index: 2;
-}
-
-.sparkle {
- position: absolute;
- width: 6px;
- height: 6px;
- background: white;
- border-radius: 50%;
- animation: sparkle 3s ease-in-out infinite;
-}
-
-@keyframes sparkle {
- 0%, 100% {
- opacity: 0;
- transform: scale(0);
- }
- 50% {
- opacity: 1;
- transform: scale(1);
- box-shadow:
- 0 0 10px #fff,
- 0 0 20px #ff69b4,
- 0 0 30px #ff69b4;
- }
-}
-
-/* Rose Petals */
-.petals-container {
- position: fixed;
- inset: 0;
- pointer-events: none;
- overflow: hidden;
- z-index: 3;
-}
-
-.petal {
- position: absolute;
- top: -50px;
- font-size: 24px;
- animation: fallPetal linear infinite;
- filter: drop-shadow(0 0 5px rgba(255, 182, 193, 0.5));
-}
-
-@keyframes fallPetal {
- 0% {
- transform: translateY(0) rotate(0deg) translateX(0);
- opacity: 0;
- }
- 10% {
- opacity: 0.8;
- }
- 90% {
- opacity: 0.8;
- }
- 100% {
- transform: translateY(110vh) rotate(360deg) translateX(100px);
- opacity: 0;
- }
-}
-
-/* Main Content */
-.kiki-main {
- position: relative;
- z-index: 10;
- display: flex;
- flex-direction: column;
- align-items: center;
- padding: 60px 20px;
- min-height: 100vh;
-}
-
-/* Title */
-.kiki-title {
- font-size: clamp(2.5rem, 8vw, 5rem);
- font-weight: 900;
- text-align: center;
- background: linear-gradient(
- 135deg,
- #ff6b9d 0%,
- #ff8fab 20%,
- #ffc3d8 40%,
- #ff8fab 60%,
- #ff6b9d 80%,
- #e84a8a 100%
- );
- background-size: 300% 300%;
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
- animation: titleGradient 5s ease-in-out infinite;
- margin-bottom: 0.5rem;
- opacity: 0;
- transform: translateY(30px);
- transition: all 1s cubic-bezier(0.34, 1.56, 0.64, 1);
- filter: drop-shadow(0 0 30px rgba(255, 107, 157, 0.5));
-}
-
-.kiki-title.show {
- opacity: 1;
- transform: translateY(0);
-}
-
-@keyframes titleGradient {
- 0%, 100% { background-position: 0% 50%; }
- 50% { background-position: 100% 50%; }
-}
-
-.kiki-subtitle {
- font-size: clamp(2rem, 6vw, 4rem);
- font-weight: 800;
- color: #ffc3d8;
- text-align: center;
- margin-bottom: 3rem;
- opacity: 0;
- transform: translateY(30px);
- transition: all 1s cubic-bezier(0.34, 1.56, 0.64, 1) 0.2s;
- text-shadow:
- 0 0 20px rgba(255, 195, 216, 0.6),
- 0 0 40px rgba(255, 107, 157, 0.4),
- 0 0 60px rgba(255, 107, 157, 0.2);
- animation: subtitlePulse 2s ease-in-out infinite;
-}
-
-.kiki-subtitle.show {
- opacity: 1;
- transform: translateY(0);
-}
-
-@keyframes subtitlePulse {
- 0%, 100% {
- text-shadow:
- 0 0 20px rgba(255, 195, 216, 0.6),
- 0 0 40px rgba(255, 107, 157, 0.4),
- 0 0 60px rgba(255, 107, 157, 0.2);
- }
- 50% {
- text-shadow:
- 0 0 30px rgba(255, 195, 216, 0.8),
- 0 0 60px rgba(255, 107, 157, 0.6),
- 0 0 90px rgba(255, 107, 157, 0.4);
- }
-}
-
-/* Photo Frame */
-.photo-frame {
- width: 100%;
- max-width: 400px;
- margin: 0 auto 3rem;
- opacity: 0;
- transform: scale(0.8) rotateY(-10deg);
- transition: all 1.2s cubic-bezier(0.34, 1.56, 0.64, 1) 0.4s;
- perspective: 1000px;
-}
-
-.photo-frame.show {
- opacity: 1;
- transform: scale(1) rotateY(0deg);
-}
-
-.photo-inner {
- background: linear-gradient(145deg, #ff6b9d, #ff8fab, #ffc3d8);
- padding: 12px;
- border-radius: 24px;
- box-shadow:
- 0 25px 80px rgba(255, 107, 157, 0.4),
- 0 10px 30px rgba(0, 0, 0, 0.3),
- inset 0 2px 0 rgba(255, 255, 255, 0.3);
- overflow: hidden;
- position: relative;
-}
-
-.photo-inner::before {
- content: "";
- position: absolute;
- inset: 0;
- background: linear-gradient(
- 135deg,
- rgba(255, 255, 255, 0.2) 0%,
- transparent 50%
- );
- pointer-events: none;
- border-radius: 24px;
-}
-
-.photo-slider {
- display: flex;
- transition: transform 0.8s cubic-bezier(0.4, 0, 0.2, 1);
-}
-
-.photo-slide {
- min-width: 100%;
-}
-
-.photo {
- width: 100%;
- height: 350px;
- object-fit: cover;
- border-radius: 16px;
- display: block;
-}
-
-.photo-dots {
- display: flex;
- justify-content: center;
- gap: 10px;
- margin-top: 16px;
-}
-
-.photo-dot {
- width: 12px;
- height: 12px;
- border-radius: 50%;
- border: none;
- background: rgba(255, 107, 157, 0.3);
- cursor: pointer;
- transition: all 0.3s ease;
-}
-
-.photo-dot:hover {
- background: rgba(255, 107, 157, 0.6);
- transform: scale(1.2);
-}
-
-.photo-dot.active {
- background: #ff6b9d;
- box-shadow: 0 0 15px rgba(255, 107, 157, 0.8);
- transform: scale(1.3);
-}
-
-/* Love Letter */
-.love-letter {
- width: 100%;
- max-width: 600px;
- margin: 0 auto 3rem;
- opacity: 0;
- transform: translateY(50px) rotateX(-10deg);
- transition: all 1.2s cubic-bezier(0.34, 1.56, 0.64, 1) 0.6s;
-}
-
-.love-letter.show {
- opacity: 1;
- transform: translateY(0) rotateX(0deg);
-}
-
-.letter-content {
- background: linear-gradient(
- 145deg,
- rgba(255, 255, 255, 0.08),
- rgba(255, 255, 255, 0.03)
- );
- backdrop-filter: blur(20px);
- border: 1px solid rgba(255, 107, 157, 0.3);
- border-radius: 24px;
- padding: 2.5rem;
- box-shadow:
- 0 20px 60px rgba(0, 0, 0, 0.3),
- 0 0 40px rgba(255, 107, 157, 0.15),
- inset 0 1px 0 rgba(255, 255, 255, 0.1);
- position: relative;
- overflow: hidden;
-}
-
-.letter-content::before {
- content: "💌";
- position: absolute;
- top: -10px;
- right: -10px;
- font-size: 80px;
- opacity: 0.1;
- transform: rotate(15deg);
-}
-
-.letter-greeting {
- font-size: 1.5rem;
- font-weight: 700;
- color: #ff8fab;
- margin-bottom: 1.5rem;
- font-style: italic;
-}
-
-.letter-text {
- color: #fff;
- font-size: 1.1rem;
- line-height: 1.8;
- margin-bottom: 1.2rem;
- text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
-}
-
-.letter-signature {
- color: #ffc3d8;
- font-size: 1.2rem;
- text-align: right;
- margin-top: 2rem;
- font-style: italic;
- line-height: 1.6;
-}
-
-.signature-name {
- font-weight: 700;
- font-size: 1.4rem;
- background: linear-gradient(135deg, #ff6b9d, #ffc3d8);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
-}
-
-/* Big Heart */
-.big-heart {
- margin: 2rem 0;
- opacity: 0;
- transform: scale(0);
- transition: all 1s cubic-bezier(0.34, 1.56, 0.64, 1) 0.8s;
-}
-
-.big-heart.show {
- opacity: 1;
- transform: scale(1);
-}
-
-.heart-pulse {
- font-size: 100px;
- animation: heartBeat 1.5s ease-in-out infinite;
- filter: drop-shadow(0 0 30px rgba(255, 107, 157, 0.6));
-}
-
-@keyframes heartBeat {
- 0%, 100% {
- transform: scale(1);
- }
- 10% {
- transform: scale(1.15);
- }
- 20% {
- transform: scale(1);
- }
- 30% {
- transform: scale(1.15);
- }
- 40% {
- transform: scale(1);
- }
-}
-
-/* Cute Messages */
-.cute-messages {
- display: flex;
- flex-wrap: wrap;
- justify-content: center;
- gap: 1rem;
- margin-top: 2rem;
- opacity: 0;
- transform: translateY(30px);
- transition: all 1s ease 1s;
-}
-
-.cute-messages.show {
- opacity: 1;
- transform: translateY(0);
-}
-
-.cute-msg {
- background: linear-gradient(135deg, rgba(255, 107, 157, 0.3), rgba(255, 143, 171, 0.2));
- backdrop-filter: blur(10px);
- padding: 12px 24px;
- border-radius: 999px;
- color: #ffc3d8;
- font-weight: 600;
- font-size: 0.95rem;
- border: 1px solid rgba(255, 107, 157, 0.3);
- animation: floatMsg 3s ease-in-out infinite;
- box-shadow: 0 5px 20px rgba(255, 107, 157, 0.2);
-}
-
-.cute-msg:nth-child(1) { animation-delay: 0s; }
-.cute-msg:nth-child(2) { animation-delay: 0.5s; }
-.cute-msg:nth-child(3) { animation-delay: 1s; }
-
-@keyframes floatMsg {
- 0%, 100% { transform: translateY(0); }
- 50% { transform: translateY(-10px); }
-}
-
-/* Responsive */
-@media (max-width: 600px) {
- .kiki-main {
- padding: 40px 16px;
- }
-
- .photo {
- height: 280px;
- }
-
- .letter-content {
- padding: 1.5rem;
- }
-
- .letter-text {
- font-size: 1rem;
- }
-
- .heart-pulse {
- font-size: 70px;
- }
-
- .cute-messages {
- flex-direction: column;
- align-items: center;
- }
-}
-
-/* Extra glow effect overlay */
-.kiki-container::before {
- content: "";
- position: fixed;
- top: 30%;
- left: 50%;
- transform: translateX(-50%);
- width: 600px;
- height: 600px;
- background: radial-gradient(circle, rgba(255, 107, 157, 0.15) 0%, transparent 70%);
- pointer-events: none;
- z-index: 0;
- animation: glowPulse 4s ease-in-out infinite;
-}
-
-@keyframes glowPulse {
- 0%, 100% { opacity: 0.5; transform: translateX(-50%) scale(1); }
- 50% { opacity: 1; transform: translateX(-50%) scale(1.2); }
-}
-
-/* Question Screen */
-.question-screen {
- position: relative;
- z-index: 10;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- min-height: 100vh;
- padding: 40px 20px;
- text-align: center;
-}
-
-.question-heart {
- font-size: 75px;
- animation: heartBounce 2s ease infinite;
- filter: drop-shadow(0 0 40px rgba(255, 107, 157, 0.6));
- margin-bottom: 1rem;
-}
-
-@keyframes heartBounce {
- 0%, 100% { transform: scale(1) rotate(-5deg); }
- 25% { transform: scale(1.1) rotate(5deg); }
- 50% { transform: scale(1) rotate(-5deg); }
- 75% { transform: scale(1.15) rotate(5deg); }
-}
-
-.question-title {
- font-size: clamp(2rem, 6vw, 3.5rem);
- font-weight: 800;
- color: #ffc3d8;
- margin-bottom: 1rem;
- text-shadow:
- 0 0 20px rgba(255, 195, 216, 0.6),
- 0 0 40px rgba(255, 107, 157, 0.4);
- animation: fadeInDown 1s ease;
-}
-
-@keyframes fadeInDown {
- from {
- opacity: 0;
- transform: translateY(-30px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-.question-text {
- font-size: clamp(1.8rem, 5vw, 3rem);
- font-weight: 900;
- background: linear-gradient(
- 135deg,
- #ff6b9d 0%,
- #ff8fab 25%,
- #ffc3d8 50%,
- #ff8fab 75%,
- #ff6b9d 100%
- );
- background-size: 300% 300%;
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
- animation: titleGradient 4s ease-in-out infinite, fadeInUp 1s ease 0.3s both;
- margin-bottom: 3rem;
- filter: drop-shadow(0 0 30px rgba(255, 107, 157, 0.5));
-}
-
-.question-buttons {
- display: flex;
- gap: 2rem;
- align-items: center;
- justify-content: center;
- flex-wrap: wrap;
- position: relative;
- min-height: 80px;
- width: 100%;
- max-width: 500px;
-}
-
-.yes-button {
- padding: 20px 50px;
- font-size: 1.5rem;
- font-weight: 700;
- color: white;
- background: linear-gradient(135deg, #ff6b9d, #ff8fab, #ff6b9d);
- background-size: 200% 200%;
- border: none;
- border-radius: 999px;
- cursor: pointer;
- transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
- box-shadow:
- 0 10px 40px rgba(255, 107, 157, 0.5),
- 0 5px 15px rgba(0, 0, 0, 0.2),
- inset 0 2px 0 rgba(255, 255, 255, 0.3);
- animation: yesButtonPulse 2s ease-in-out infinite, fadeInUp 1s ease 0.5s both;
- z-index: 10;
-}
-
-@keyframes yesButtonPulse {
- 0%, 100% {
- transform: scale(1);
- box-shadow:
- 0 10px 40px rgba(255, 107, 157, 0.5),
- 0 5px 15px rgba(0, 0, 0, 0.2),
- inset 0 2px 0 rgba(255, 255, 255, 0.3);
- }
- 50% {
- transform: scale(1.05);
- box-shadow:
- 0 15px 50px rgba(255, 107, 157, 0.7),
- 0 8px 25px rgba(0, 0, 0, 0.3),
- inset 0 2px 0 rgba(255, 255, 255, 0.3);
- }
-}
-
-.yes-button:hover {
- transform: scale(1.15) !important;
- background-position: 100% 0;
- box-shadow:
- 0 20px 60px rgba(255, 107, 157, 0.7),
- 0 10px 30px rgba(0, 0, 0, 0.3),
- inset 0 2px 0 rgba(255, 255, 255, 0.4);
-}
-
-.no-button {
- padding: 15px 35px;
- font-size: 1.1rem;
- font-weight: 600;
- color: #ff8fab;
- background: rgba(30, 20, 40, 0.95);
- border: 2px solid rgba(255, 107, 157, 0.5);
- border-radius: 999px;
- cursor: pointer;
- transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
- backdrop-filter: blur(10px);
- animation: fadeInUp 1s ease 0.6s both;
- z-index: 5;
- white-space: nowrap;
-}
-
-.no-button:hover {
- background: rgba(50, 30, 60, 0.95);
- border-color: rgba(255, 107, 157, 0.7);
-}
-
-.no-button.runaway {
- z-index: 99999 !important;
- animation: popIn 0.25s cubic-bezier(0.175, 0.885, 0.32, 1.275);
- box-shadow:
- 0 10px 40px rgba(255, 107, 157, 0.5),
- 0 0 20px rgba(255, 107, 157, 0.3),
- 0 0 60px rgba(255, 107, 157, 0.2);
- background: rgba(30, 20, 40, 0.98);
- border: 2px solid rgba(255, 107, 157, 0.8);
- pointer-events: auto;
-}
-
-@keyframes popIn {
- 0% {
- transform: scale(0.3) rotate(-10deg);
- opacity: 0;
- }
- 60% {
- transform: scale(1.15) rotate(3deg);
- }
- 100% {
- transform: scale(1) rotate(0deg);
- opacity: 1;
- }
-}
-
-.hint-text {
- margin-top: 2rem;
- color: #ffc3d8;
- font-size: 1.1rem;
- font-style: italic;
- animation: fadeIn 0.5s ease;
- text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
-}
-
-@keyframes fadeIn {
- from { opacity: 0; }
- to { opacity: 1; }
-}
-
-/* Make the Yes button grow bigger over time as No keeps running away */
-.yes-button:active {
- transform: scale(0.95) !important;
-}
-
-/* Responsive adjustments for question screen */
-@media (max-width: 600px) {
- .question-heart {
- font-size: 70px;
- }
-
- .question-buttons {
- flex-direction: column;
- gap: 1.5rem;
- }
-
- .yes-button {
- padding: 18px 45px;
- font-size: 1.3rem;
- }
-
- .no-button {
- padding: 12px 30px;
- font-size: 1rem;
- }
-}
-
diff --git a/src/app/darecek/page.tsx b/src/app/darecek/page.tsx
deleted file mode 100644
index f5b625c..0000000
--- a/src/app/darecek/page.tsx
+++ /dev/null
@@ -1,370 +0,0 @@
-"use client";
-
-import { useEffect, useState } from "react";
-import Image from "next/image";
-import "./darecek.css";
-
-export default function KikiPage() {
- const [hasAnswered, setHasAnswered] = useState(false);
- const [showMessage, setShowMessage] = useState(false);
- const [currentPhotoIndex, setCurrentPhotoIndex] = useState(0);
- const [hearts, setHearts] = useState<{ id: number; left: number; delay: number; duration: number; size: number }[]>([]);
- const [noButtonStyle, setNoButtonStyle] = useState({});
- const [noButtonText, setNoButtonText] = useState("ne 😢");
- const [noHoverCount, setNoHoverCount] = useState(0);
- const [isRunning, setIsRunning] = useState(false);
-
- const noButtonTexts = [
- "ne 😢",
- "fakt? 🥺",
- "pjosim? 🥺",
- "hej 😡",
- "stop 👿",
- "nech toooo 😭",
- "😭😭😭",
- "budu urazeny 🥺",
- "grrrrr 👿👿👿",
- "stejnak nemas na vyber 😝😝😝",
- ];
-
- // Add your photos here - just put images in /public/darecek/ folder
- // named photo1.jpg, photo2.jpg, etc.
- const photos = [
- "/darecek/photo1.jpg",
- "/darecek/photo2.jpg",
- "/darecek/photo3.jpg",
- "/darecek/photo4.jpg",
- "/darecek/photo5.jpg",
- ];
-
- const moveNoButton = (e: React.MouseEvent | React.TouchEvent) => {
- // Get current mouse/touch position
- let currentX = 0;
- let currentY = 0;
-
- if ('touches' in e) {
- currentX = e.touches[0].clientX;
- currentY = e.touches[0].clientY;
- } else {
- currentX = e.clientX;
- currentY = e.clientY;
- }
-
-
- const viewportWidth = window.innerWidth;
- const viewportHeight = window.innerHeight;
- const buttonWidth = 200;
- const buttonHeight = 60;
- const padding = 20;
- const minDistanceFromMouse = 200; // Minimum distance from mouse
-
- // Calculate safe bounds
- const minX = padding;
- const maxX = viewportWidth - buttonWidth - padding;
- const minY = padding;
- const maxY = viewportHeight - buttonHeight - padding;
-
- let newX: number;
- let newY: number;
- let attempts = 0;
- const maxAttempts = 50;
-
- // Keep trying until we find a position far enough from mouse
- do {
- newX = minX + Math.random() * (maxX - minX);
- newY = minY + Math.random() * (maxY - minY);
- attempts++;
-
- // Calculate distance from mouse
- const distance = Math.sqrt(
- Math.pow(newX + buttonWidth / 2 - currentX, 2) +
- Math.pow(newY + buttonHeight / 2 - currentY, 2)
- );
-
- // If far enough from mouse, use this position
- if (distance > minDistanceFromMouse) break;
-
- } while (attempts < maxAttempts);
-
- // If still too close after max attempts, move to opposite side of screen
- const buttonCenterX = newX + buttonWidth / 2;
- const buttonCenterY = newY + buttonHeight / 2;
- const distanceFromMouse = Math.sqrt(
- Math.pow(buttonCenterX - currentX, 2) +
- Math.pow(buttonCenterY - currentY, 2)
- );
-
- if (distanceFromMouse < minDistanceFromMouse) {
- // Move to opposite quadrant of the screen
- if (currentX < viewportWidth / 2) {
- newX = maxX - Math.random() * (maxX / 3);
- } else {
- newX = minX + Math.random() * (maxX / 3);
- }
-
- if (currentY < viewportHeight / 2) {
- newY = maxY - Math.random() * (maxY / 3);
- } else {
- newY = minY + Math.random() * (maxY / 3);
- }
- }
-
- // Ensure bounds
- newX = Math.max(minX, Math.min(maxX, newX));
- newY = Math.max(minY, Math.min(maxY, newY));
-
- setNoButtonStyle({
- position: 'fixed',
- left: `${newX}px`,
- top: `${newY}px`,
- });
-
- setIsRunning(true);
- setNoHoverCount(prev => prev + 1);
- setNoButtonText(noButtonTexts[Math.min(noHoverCount + 1, noButtonTexts.length - 1)]);
- };
-
- const handleYesClick = () => {
- setHasAnswered(true);
- // Show message after transition
- setTimeout(() => setShowMessage(true), 500);
- };
-
- useEffect(() => {
- // Generate floating hearts
- const newHearts = Array.from({ length: 30 }, (_, i) => ({
- id: i,
- left: Math.random() * 100,
- delay: Math.random() * 5,
- duration: 5 + Math.random() * 10,
- size: 15 + Math.random() * 25,
- }));
- setHearts(newHearts);
- }, []);
-
- useEffect(() => {
- if (!hasAnswered) return;
-
- // Auto-rotate photos
- const interval = setInterval(() => {
- setCurrentPhotoIndex((prev) => (prev + 1) % photos.length);
- }, 4000);
- return () => clearInterval(interval);
- }, [hasAnswered, photos.length]);
-
- // Question screen
- if (!hasAnswered) {
- return (
-
- {/* Floating Hearts Background */}
-
- {hearts.map((heart) => (
-
- 💖
-
- ))}
-
-
- {/* Sparkles */}
-
- {Array.from({ length: 50 }).map((_, i) => (
-
- ))}
-
-
- {/* Question Content */}
-
-
😝
-
kikiiiii
-
budes muj valentyn? ❤️
-
-
-
- jo 😘
-
- {!isRunning && (
-
- {noButtonText}
-
- )}
-
-
- {noHoverCount > 3 && (
-
- {noHoverCount > 6 ? "dej ano tele 😛" : "to tlacitko ti zdrha 😝😝😝"}
-
- )}
-
-
- {/* Runaway No Button - rendered outside the question-buttons container */}
- {isRunning && (
-
- {noButtonText}
-
- )}
-
- );
- }
-
- return (
-
- {/* Floating Hearts Background */}
-
- {hearts.map((heart) => (
-
- 💘
-
- ))}
-
-
- {/* Sparkles */}
-
- {Array.from({ length: 50 }).map((_, i) => (
-
- ))}
-
-
- {/* Main Content */}
-
- {/* Title */}
-
- stastnej valentynnnn
-
-
-
- laskoooo 😘😘😝
-
-
- {/* Photo Gallery */}
-
-
-
- {photos.map((photo, index) => (
-
- {
- // Fallback if image doesn't exist
- (e.target as HTMLImageElement).src = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300' viewBox='0 0 300 300'%3E%3Crect fill='%23ff6b9d' width='300' height='300'/%3E%3Ctext x='150' y='150' text-anchor='middle' dy='.3em' fill='white' font-size='60'%3E💕%3C/text%3E%3C/svg%3E";
- }}
- />
-
- ))}
-
-
-
- {photos.map((_, index) => (
- setCurrentPhotoIndex(index)}
- />
- ))}
-
-
-
- {/* Love Letter */}
-
-
-
pro moji princeznu,
-
- tohle je nas druhej valentyn a jsem moc moc stastnej, ze ho muzu stravit s tebou 😘
-
-
- si ta nejlepsi, nejkrasnejsi a nejroztomilejsi holka na svete, kterou bych si kdy mohl prat, a jsem vdecnej, ze si to semnou vydrzela, i pres ty moje nalady 🥺😝❤️
-
-
- tak strasne moc te milujuuuu a chci byt s tebou pro zbytek svyho zivota, lasko moje ❤️🥹
-
-
- tvoje laska,
- Martin ❤️
-
-
-
-
- {/* Animated Heart */}
-
-
- {/* Cute Messages */}
-
- jsi moje 👸🏽
- miluju te nejvic ve vesmiru 😝
- chci jenom tebee 😍
-
-
-
- {/* Rose petals falling */}
-
- {Array.from({ length: 20 }).map((_, i) => (
-
- 💝
-
- ))}
-
-
- );
-}
-
diff --git a/src/app/page.css b/src/app/page.css
index 84ad935..90d0bd5 100644
--- a/src/app/page.css
+++ b/src/app/page.css
@@ -26,6 +26,7 @@
--bg-hard: #32302f;
--fg: #ebdbb2;
--gray: #a89984;
+ --prettypurple: #733999;
--accent: #fabd2f; /* Gruvbox Yellow */
--accent2: #fe8019; /* Gruvbox Orange */
--accent3: #d79921; /* Gruvbox Dark Yellow */
@@ -506,6 +507,12 @@ body {
color: var(--purple);
}
+.subsection-panel.friends-panel {
+ background: rgba(255, 255, 255, 0.08); /* slightly light */
+ backdrop-filter: blur(16px);
+ -webkit-backdrop-filter: blur(16px);
+}
+
.subsection-panel.friends-panel .subsection-panel-label {
color: var(--aqua);
}
@@ -644,7 +651,7 @@ body {
overflow: hidden;
border: 1px solid var(--card-border);
border-top: none;
- aspect-ratio: 2 / 1;
+ aspect-ratio: 16 / 9;
transform: translateZ(0);
will-change: transform;
}
@@ -792,6 +799,20 @@ body {
.friend-iframe-container {
aspect-ratio: 16 / 9;
}
+
+ .gym-grid {
+ gap: 12px;
+ padding: 16px;
+ }
+
+ .gym-item {
+ padding: 12px;
+ gap: 8px;
+ }
+
+ .gym-weight {
+ font-size: 1.4rem;
+ }
}
@media (max-width: 520px) {
@@ -807,12 +828,38 @@ body {
grid-template-columns: 1fr;
}
+ .gym-grid {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 4px;
+ padding: 12px 4px;
+ }
+
+ .gym-item {
+ padding: 8px 2px;
+ gap: 4px;
+ min-width: 0;
+ }
+
+ .gym-icon {
+ max-width: 32px !important;
+ }
+
+ .gym-label {
+ font-size: 0.55rem;
+ letter-spacing: 0.02em;
+ }
+
+ .gym-weight {
+ font-size: 0.95rem;
+ }
+
.project-grid {
grid-template-columns: 1fr;
}
.video-grid {
grid-template-columns: 1fr;
+ gap: 10px;
}
.project-image {
@@ -833,6 +880,41 @@ body {
}
}
+/* ============================================
+ SEARCH BAR
+ ============================================ */
+.search-section {
+ margin-top: 16px;
+}
+
+.search-form {
+ display: flex;
+ padding: 20px 24px;
+}
+
+.search-bar {
+ width: 100%;
+ padding: 12px 16px;
+ background: rgba(255, 255, 255, 0.05); /* very transparent */
+ backdrop-filter: blur(10px) saturate(120%);
+ -webkit-backdrop-filter: blur(10px) saturate(120%);
+ border: 1px solid var(--tui-border);
+ color: var(--fg);
+ font-family: var(--font-custom-mono), monospace;
+ font-size: 1rem;
+ outline: none;
+ transition: all 0.3s ease;
+}
+
+.search-bar:focus {
+ border-color: var(--red);
+ box-shadow: 0 0 10px rgba(74, 233, 52, 0.3);
+}
+
+.search-bar::placeholder {
+ color: var(--gray);
+}
+
/* Joker Animation */
.joker-flash-overlay {
position: fixed;
@@ -873,3 +955,115 @@ body {
transform: scale(0) rotate(-20deg);
}
}
+
+/* ============================================
+ GYM PANEL
+ ============================================ */
+.gym-section {
+ margin-top: 16px;
+}
+
+.gym-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 16px;
+ padding: 24px;
+ text-align: center;
+}
+
+.gym-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 10px;
+ padding: 16px;
+ background: rgba(255, 255, 255, 0.02);
+ border: 1px solid rgba(168, 153, 132, 0.1);
+ transition: all 0.3s ease;
+}
+
+.gym-item:hover {
+ background: rgba(250, 189, 47, 0.05);
+ border-color: rgba(250, 189, 47, 0.3);
+ transform: translateY(-4px);
+}
+
+.gym-icon {
+ opacity: 0.9;
+ transition: opacity 0.3s ease, filter 0.3s ease;
+ width: 100%;
+ max-width: 48px;
+ height: auto;
+}
+
+.gym-item:hover .gym-icon {
+ opacity: 1;
+ filter: drop-shadow(0 0 8px rgba(250, 189, 47, 0.8));
+}
+
+.gym-label {
+ font-size: 0.85rem;
+ font-weight: 700;
+ color: var(--gray);
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+}
+
+.gym-weight {
+ font-size: 1.6rem;
+ font-weight: 800;
+ color: var(--fg);
+ font-family: var(--font-custom-mono), monospace;
+}
+
+/* ============================================
+ HEATMAP
+ ============================================ */
+.heatmap-container {
+ display: flex;
+ width: 100%;
+ overflow-x: auto;
+ gap: 2px;
+ scrollbar-width: none;
+ scrollbar-color: var(--gray) transparent;
+}
+
+.heatmap-week {
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ gap: 2px;
+}
+
+.heatmap-cell {
+ width: 100%;
+ aspect-ratio: 1;
+ border-radius: 2px;
+ background-color: var(--bg-hard);
+ transition: transform 0.1s ease;
+}
+
+.heatmap-cell:hover {
+ transform: scale(1.2);
+ z-index: 10;
+ box-shadow: 0 0 6px rgba(142, 68, 173, 0.6);
+}
+
+.heatmap-cell[data-level="1"] { background-color: rgba(142, 68, 173, 0.4); }
+.heatmap-cell[data-level="2"] { background-color: rgba(142, 68, 173, 0.6); }
+.heatmap-cell[data-level="3"] { background-color: rgba(142, 68, 173, 0.8); }
+.heatmap-cell[data-level="4"] { background-color: rgba(142, 68, 173, 1); }
+
+.heatmap-legend-cell {
+ width: 11px;
+ height: 11px;
+ border-radius: 2px;
+ background-color: var(--bg-hard);
+ flex-shrink: 0;
+}
+
+.heatmap-legend-cell[data-level="1"] { background-color: rgba(142, 68, 173, 0.4); }
+.heatmap-legend-cell[data-level="2"] { background-color: rgba(142, 68, 173, 0.6); }
+.heatmap-legend-cell[data-level="3"] { background-color: rgba(142, 68, 173, 0.8); }
+.heatmap-legend-cell[data-level="4"] { background-color: rgba(142, 68, 173, 1); }
+
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 21cb677..b4ef082 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -4,6 +4,7 @@ import { Metadata } from 'next';
import JokerLogo from "./components/JokerLogo";
import ServiceButton from "./components/ServiceButton";
import SlBackground from "./components/SlBackground";
+import ContributionHeatmap from "./components/ContributionHeatmap";
export const metadata: Metadata = {
title: 'dvorakmortonxd.dev',
@@ -23,109 +24,109 @@ const codingProjects = [
{
title: "Hospital Execution",
desc: "the first ever real game I made, in pygame.",
- img: "/coding-1.png",
+ img: "/coding-1.webp",
url: "https://martin-dv.itch.io/hospital-execution-demo",
},
{
title: "Underbaranoia",
desc: "basically a undertale like infinite fight simulator that gets progressively harder, made in pygame.",
- img: "/coding-2.png",
+ img: "/coding-2.webp",
url: "https://martin-dv.itch.io/underbaranoia",
},
{
title: "Offline memer",
desc: "parody of the discord bot \"Dank Memer\" made in batch. (this was technically my first ever game I published).",
- img: "/coding-3.png",
+ img: "/coding-3.webp",
url: "https://martin-dv.itch.io/offline-memer",
},
{
title: "4y",
desc: "just a renamed fork of the ly login manager (based login manager btw I love it), no extra features, just a rename, its actually outdated so dont use it.",
- img: "/coding-4.png",
+ img: "/coding-4.webp",
url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/4y",
},
{
title: "4rch linux",
desc: "same as above, basically just a renamed fork of arch linux with calamares installer, also outdated and not maintained at all so no use please.",
- img: "/coding-5.png",
+ img: "/coding-5.webp",
url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/4rch-linux",
},
{
title: "You_Are_An_Idiot_Virus.py",
desc: "this is just a python script that just spams blinking \"you are an idiot\" windows, made it as a prank I think, not really sure rn.",
- img: "/coding-6.png",
+ img: "/coding-6.webp",
url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/uranidiot",
},
{
title: "Venturesome",
desc: "a browser I wrote in python using PyQtWebEngine with PyQt5, actually pretty cool and modular but I couldnt get past the stage of adding a tab system, basically surpassed by my other project: RustyWolf.",
- img: "/coding-7.png",
+ img: "/coding-7.webp",
url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/Venturesome",
},
{
title: "Mandelbrot set in Pygame",
desc: "a python pygame script that renders the mandelbrot set, made it when I was fascinated by how it looks and ngl it still looks cool af.",
- img: "/coding-8.png",
+ img: "/coding-8.webp",
url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/mandelbrot",
},
{
title: "Underpygametale",
desc: "a remake of undertale written in pygame, got it to about the flowey part (at the beginning) and didnt touch it in a long time.",
- img: "/coding-9.png",
+ img: "/coding-9.webp",
url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/underpygametale",
},
{
title: "Many discord bots...",
desc: "so many of them, once I (allegedly, pls discord dont ban me) even wrote a \"self-bot\" which auto-advertised a minecraft server on minecraft discord server in lfg-hosting every two hours, around 800 people joined in total.",
- img: "/coding-10.png",
+ img: "/coding-10.webp",
url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/PYGETEX",
},
{
title: "MMO minecraft plugin",
desc: "a minceraft plugin with custom bosses, items, and functions. pretty barebones and basic but I did it all manually before vibecoding was even a thing so what.",
- img: "/coding-11.png",
+ img: "/coding-11.webp",
url: "https://www.youtube.com/watch?v=cSAX5Ds61ac",
},
{
title: "Many many failed minecraft servers..",
desc: "creative games, softcraft, frostville, eusmp, eurthsmp, softsmp and many other SMPs that died later on. I cant even count how many mc servers I had in total.",
- img: "/coding-12.png",
+ img: "/coding-12.webp",
url: "https://discord.gg/KtHRm9kRmy",
},
{
title: "Swords and Sandals 2 pygame remake",
desc: "an unfinished remake of swords and sandals 2 in pygame, I got bored of it and never finished it but ill finish it one day for sure lol.",
- img: "/coding-13.png",
+ img: "/coding-13.webp",
url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/sas2py",
},
{
title: "Ollama server",
desc: "my ollama vm running on my proxmox with a gpu passthroughed RTX 3070, dm me if u wanna test it lol.",
- img: "/coding-14.png",
+ img: "/coding-14.webp",
url: "https://ai.dvorakmortonxd.dev/",
},
{
title: "Batch MSDOS Simulator",
desc: "a freshman school project on making games in batch, it was like an OS simulator with a web browser, games, photos, even a video suprise (youll have to try it to figure that one out lol).",
- img: "/coding-15.png",
+ img: "/coding-15.webp",
url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/DvorakMSDOS",
},
{
title: "RustyWolf",
desc: "a browser I made in rust with webkitgtk, I made it to be lightweight and to be able to be ran on macbook unibody 2010 before I realised I got scammed.. It's the successor to my previous project Venturesome :)",
- img: "/coding-16.png",
+ img: "/coding-16.webp",
url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/RustyWolf",
},
{
title: "dxdwm",
desc: "a small x11 window manager written in rust.",
- img: "/coding-17.png",
+ img: "/coding-17.webp",
url: "https://git.dvorakmortonxd.dev/dvorakmortonxd/dxdwm",
},
{
title: "proxmox setup",
desc: "my proxmox setup with more than 8 vms for my services, this is running literally everything at my house.",
- img: "/proxmox.png",
+ img: "/proxmox.webp",
url: "https://proxmox.dvorakmortonxd.dev/",
},
];
@@ -149,63 +150,63 @@ export default function Home() {
const techProjects = [
{
title: "Gentoo Setup",
- desc: "my main computer with gentoo. specs: Ryzen 5 3600 (6c/12t), GTX 1050 Ti (yes im aware I could use the rtx 3070 from the proxmox server but I dont need it and its much better off being in there cuz of local ai), 16gb of ram and a 240gb ssd.",
- image: "/gentoo-setup.png",
+ desc: "my main computer with gentoo. specs: Ryzen 5 3600 (6c/12t), RX 580 8GB ASUS ROG, 16gb of ram and a 240gb sata ssd.",
+ image: "/gentoo-setup.webp",
},
{
title: "Proxmox Server",
- desc: "my personal proxmox server (dm me on ig if u need a VPS/hosting), specs: Xeon E5 2680 v4 (14c/28t), RTX 3070 (for local ai), 68gb ddr4 rdimm ram (2*16gb, 1*32gb, 1*4gb), 256gb of sata m2 space + 1tb hdd + 750gb hdd.",
- image: "/proxmox-server.png",
+ desc: "my personal proxmox server (dm me on ig if u need a VPS/hosting), specs: Xeon E5 2680 v4 (14c/28t), RTX 3070 (for local ai) and GTX 1050 Ti (for jellyfin), 68gb ddr4 rdimm ram (2*16gb, 1*32gb, 1*4gb), 256gb of sata m2 space + 1tb hdd + 750gb hdd.",
+ image: "/proxmox-server.webp",
},
{
title: "Xbox 360 S with badupdate",
desc: "xbox 360 slim (trinity) with badupdate exploit, allowing to boot custom software. (not my photo), the specs are XCGPU (3c/6t), 0.5GB of gddr3 ram and a 500gb hdd.",
- image: "/xbox360.png",
+ image: "/xbox360.webp",
},
{
title: "Macbook Air M4 13\"",
desc: "my main device for basically everything except gaming. specs are Apple M4 (cpu:10c,gpu:8c), 16gb of unified ram (lpddr5x), 256gb Storage.",
- image: "/macbook-air.png",
+ image: "/macbook-air.webp",
},
{
title: "Macbook Air 2013 11\"",
desc: "bought this for tinkering lol, specs are intel core i5 (2c/4t), 8gb of ddr3 ram and 250gb ssd, installed arch linux on it with i3-gaps (this is my laptop not josef's I gave it to him lol).",
- image: "/macbook-air-11.png",
+ image: "/macbook-air-11.webp",
},
{
title: "iPhone 7 128gb",
desc: "somehow found a listing for 4 bucks (refurbed.cz) for it so I got it lol, it has a little dent I marked it on the photo (which isnt mine btw), except cosmetic damage its pretty much fully functional, specs are Apple A10 (4c/4t), 2gb of ram and 128gb of storage",
- image: "/iphone-7.png",
+ image: "/iphone-7.webp",
},
{
title: "Macbook Unibody 2010",
desc: "found random listing on bazos for 15 bucks but after I bought a power adapter it turned out to be non functioning so I got scammed :(",
- image: "/macbook2010.png",
+ image: "/macbook2010.webp",
},
{
title: "ThinkPad T400s 14\"",
- desc: "got it from a random guy for 20 bucks, its an old laptop from 2009 and I disabled intel AMT and slapped void linux on it and i3wm on it, specs are intel core 2 duo (2c/2t), 8gb ddr3 ram and 800gb hdd.",
- image: "/thinkpadt400s.png",
+ desc: "got it from a random guy for 20 bucks, its an old laptop from 2009 and I slapped void linux on it and i3wm on it, specs are intel core 2 duo (2c/2t), 8gb ddr3 ram and 800gb hdd.",
+ image: "/thinkpadt400s.webp",
},
{
title: "Asus N56JR 15.6\"",
desc: "one of my first laptops my dad got for me when I was like 12, still works but the battery is KO, specs are intel core i7 4700HQ (4c/8t), 8gb ddr3 ram and 240gb ssd, it currently runs ubuntu linux 24.04LTS and my mom uses it for movies and shows.",
- image: "/asuslaptop.png",
+ image: "/asuslaptop.webp",
},
{
title: "iPhone 11 128gb",
desc: "my first iphone I got from my parents at 13, rn my dad has it because I switched over to the iphone 16 pro in 2025, specs are Apple A13 (6c/6t), 4gb of ram and 128gb of storage. (NOT MY IMAGE)",
- image: "/iphone11.png",
+ image: "/iphone11.webp",
},
{
title: "iPhone 16 Pro 128gb",
desc: "originally wanted iphone 13 mini (because of the size) but I somehow decided to get 16 pro, which is a bit smaller than my older iphone 11, specs are Apple A18 pro (6c/6t), (btw this chip is the same chip used in the macbook neo so thats cool) and 8gb of ram and 128gb of storage, my main phone.",
- image: "/iphone16pro.png",
+ image: "/iphone16pro.webp",
},
{
title: "Xbox one S 2TB",
desc: "my dad bought it for me also in like 2018 or 2019 and I sometimes play the console edition of minecraft because I like to play the gliding minigame on it when someone comes over.",
- image: "/xboxones.png",
+ image: "/xboxones.webp",
},
];
@@ -258,6 +259,16 @@ export default function Home() {
+ {/* Search Panel */}
+
+
{/* Social Links Panel */}
@@ -282,6 +293,33 @@ export default function Home() {
+ {/* Gym SBD Panel */}
+
+
+
├─ GYM_SBD_AT_73KG_BW.DB
+
+
+
+
SQUAT
+
125kg
+
5.1.2025
+
+
+
+
BENCH
+
108kg
+
25.4.2026
+
+
+
+
DEADLIFT
+
165kg
+
17.12.2024
+
+
+
+
+
{/* About Me Panel */}
@@ -292,13 +330,13 @@ export default function Home() {
- Hey, I'm Martin Dvořák — a 17-year-old IT student based in the Czech Republic, specializing in network management and administration at sssvt.cz . I'm a freshman and I have wanted to go to this school since 7th grade (2022) so I'm happy I got in in 2025, the school is pretty cool so if you are in middle school and interested in IT, check it.
+ Hey, I'm Martin Dvořák — a 17-year-old IT student based in the Czech Republic, specializing in network management and administration at sssvt.cz . I'm a freshman and I have wanted to go to this school since 7th grade (2022) so I'm happy I got in in 2025, the school is pretty cool so if you are in middle school and interested in IT, check it.
I'm a passionate homelabber and developer heavily focused on self-hosting literally everything , writing code, and tinkering with Linux systems and retro hardware. Whether it's configuring Proxmox, reviving an old Thinkpad with Void Linux, or compiling Gentoo on my main rig, I'm always looking at bazos to get more retro hardware.
- In my free time I mostly spend time with my girl {'<'}3, also constructing some of my self hosted stuff, and also when I'm in my gaming mood (which is kinda rare nowadays) I play terraria (around 1300hr playtime btw) and minecraft modpacks with mekanism. I also go to the gym around 3-5 times a week, running a PPL split focused on strength/powerlifting, my SBD total is 398kg (Squat:125kg, Bench:108kg, Deadlift:165kg) with a bodyweight of 73kg.
+ In my free time I mostly spend time with my girl {'<'}3, I also spend a lot of time constructing some of my self hosted stuff, and also when I'm in my gaming mood (which is kinda rare nowadays) I play terraria (around 1300hr playtime btw) and minecraft modpacks with mekanism. I also go to the gym around 3-5 times a week, running a PPL split focused on strength/powerlifting and especially SBD, lately I've also taken interest in Jiu-Jitsu lessons for self-defense.
@@ -371,7 +409,7 @@ export default function Home() {
className="gitdxd"
icon="🐙"
name="GitDXD"
- desc="Better Github"
+ desc="Best Git Hosting OAT"
/>
@@ -388,25 +426,81 @@ export default function Home() {
className="softcraft"
icon="⛏️"
name="Softcraft"
- desc="Play on my Minecraft Server!"
+ desc="Try my minecraft server"
/>
}
name="Discord"
- desc="Join our community"
+ desc="Join SoftCraft Discord"
/>
+
+ {/* GitDXD Panel */}
+
+
+
├─ GITDXD.GIT
+
+
GitDXD
+
Self-hosted Git Instance
+
+
+
+
+
My very own forgejo git instance, feel free to contact me if you wanna join but as of now I've made it exclusively private for me and my friends. Visit it at git.dvorakmortonxd.dev .
+
+
+
+
+
+ {/* Commits Panel */}
+
+
+
├─ CONTRIBUTIONS@GITDXD.GIT
+
+
+
+
+
+
+ {/* RustyWolf Panel */}
+
+
+
├─ RUSTYWOLF.RS
+
+
Introducing RustyWolf
+
+
+
+
What makes it so cool???
+
+
A lightweight browser made in Rust with WebKitGTK. It's the successor to my previous project Venturesome, aiming to provide a fast and minimalist browsing experience. It's a perfect browser for old machines that struggle with modern browsers. Check it out at GitDXD .
+
+
+
+
{/* Projects */}
@@ -415,6 +509,7 @@ export default function Home() {
├─ TECH_LIST.JSON
+
All my hardware equipment :)
{techProjects.map((project) => (
@@ -434,6 +529,7 @@ export default function Home() {
├─ PROJECTS.DOCX
+
All the stuff I've worked on :))
>
diff --git a/src/app/softcraft/page.tsx b/src/app/softcraft/page.tsx
index 0bb09aa..23bc282 100644
--- a/src/app/softcraft/page.tsx
+++ b/src/app/softcraft/page.tsx
@@ -24,7 +24,7 @@ export default function Softcraft() {
}
.header, .hero-panel, .tui-panel, .footer, .service-button, .social-button, .video-container, .hero-panel-label, .tui-panel-label, .footer-label {
- background-image: linear-gradient(rgba(10, 10, 10, 0.85), rgba(10, 10, 10, 0.85)), url(/dirt.png) !important;
+ background-image: linear-gradient(rgba(10, 10, 10, 0.85), rgba(10, 10, 10, 0.85)), url(/dirt.webp) !important;
background-repeat: repeat !important;
background-size: 64px !important;
image-rendering: pixelated !important;
@@ -32,7 +32,7 @@ export default function Softcraft() {
}
.terminal-box {
- background-image: linear-gradient(rgba(0, 0, 0, 0.95), rgba(0, 0, 0, 0.95)), url(/dirt.png) !important;
+ background-image: linear-gradient(rgba(0, 0, 0, 0.95), rgba(0, 0, 0, 0.95)), url(/dirt.webp) !important;
background-repeat: repeat !important;
background-size: 64px !important;
image-rendering: pixelated !important;
@@ -45,7 +45,7 @@ export default function Softcraft() {
width: '100vw',
height: '100vh',
zIndex: -1,
- backgroundImage: 'url(/minecrafttest2.png)',
+ backgroundImage: 'url(/minecrafttest2.webp)',
backgroundSize: 'cover',
animation: 'mc-panorama-pan 120s linear infinite alternate',
filter: 'brightness(0.6)'
@@ -82,7 +82,7 @@ export default function Softcraft() {