revert to the state before the editorial rework (8669263): restore the terminal layout, phone home screen and pre-rework assets

This undoes 8669263..1880a5b as a single revert commit; the reverted work
remains reachable in history at 1880a5b.
This commit is contained in:
Martin Dvořák 2026-09-30 10:02:47 +00:00
commit b2244da743
24 changed files with 1693 additions and 3108 deletions

View file

@ -2,38 +2,27 @@
> The source code for my personal website, **[dvorakmortonxd.dev](https://dvorakmortonxd.dev)**.
It's a **cartoon-skeuomorphic personal site**: a warm cream desk with chunky, brightly coloured
hardware resting on it, drawn entirely in CSS — no textures, no images — with the whole KDE
desktop simulation kept behind a physical power switch. Two modes, one content set:
This is not a normal portfolio page. It ships **two fully interactive shells** and picks
which one to show based on the saved theme and the device, all from the same content:
- **Web** (default) — the desk. A monitor carries the headline with a candy-keycap keyboard in
front of it and a mini rack beside it; services are 1U rack units with coloured strips and
health LEDs, the 18 coding projects are labelled drives in a drawer, the machines are cards
pinned to a cork board, the contribution heatmap is printed on a receipt, friends are business
cards, the gym numbers are a scoreboard and the socials are a patch panel with coloured ports.
[`/credits`](https://dvorakmortonxd.dev/credits) lists the type and nothing else — there are no
asset licences because there are no assets.
- **Desktop mode** — the KDE Plasma / Windows-style **desktop simulation**: draggable
snap-to-grid icons, resizable/floating windows, a Start menu, taskbar, live clock and a
working in-browser terminal (Alacritty). Reached from the power switch and hidden on phones.
- **`skeuo`** (default) — a KDE Plasma / Windows-style **desktop simulation**: draggable
snap-to-grid icons, resizable/floating windows, a Start menu, taskbar and live clock.
On phones it becomes an **iOS-style home screen** with a widget grid, dock, drag-to-reorder
and an iOS launch animation.
- **`terminal`** — a **Gruvbox TUI** version of the site: TUI panels, an animated ASCII
train background, a clickable easter-egg logo, and a working in-browser terminal (Alacritty)
with commands like `help`, `ls`, `cat`, `neofetch`, `emerge`, `ssh` and more.
Both modes surface the same personal content: socials, self-hosted services with **live
Both shells surface the same personal content: socials, self-hosted services with **live
up/down health checks**, a hardware collection, coding projects, a **GitDXD contribution
heatmap**, gym SBD and links to friends' sites.
heatmap**, a gym SBD panel and links to friends' sites.
## ✨ Features
- **Web theme is the landing view** — the site always opens on the desk; the theme is
deliberately not persisted, so a reload never drops you into the desktop.
- **CSS-only skeuomorphism** — every surface is a flat gradient with a thick bottom edge, a soft
cast shadow and `color-mix()` tints: slate chassis, cream plastic, paper, cork, black glass,
LEDs, screws, pushpins. The web theme ships no images at all.
- **Not afraid of colour** — a hue per item (orange / teal / blue / lilac / mint / coral /
yellow) cycles through every list, so the desk reads as separate pieces of hardware instead of
one grey wall.
- **Desktop mode (desktop-only)** — a physical power switch in the top rail (and in the footer)
flips to the KDE-style desktop for the session. Phones never get it: the switch is hidden, so
the old iOS-style phone home screen is gone.
- **Two themes / shells** — KDE-style desktop and Gruvbox terminal, toggled from either UI
and persisted in `localStorage` (applied pre-paint to avoid a flash).
- **Phone vs. desktop detection** — a user-agent sniff on `<html data-device>` decides whether
the desktop or the mobile home screen is shown.
- **Draggable desktop icons** — free placement that snaps to a measured grid, one icon per
cell, with a follow-the-cursor drag ghost. Icons shrink on cramped viewports so they never
collide.
@ -69,17 +58,13 @@ heatmap**, gym SBD and links to friends' sites.
- **Framework:** Next.js 16 (App Router, Turbopack)
- **Language:** TypeScript, React 19 (client components everywhere interactivity lives)
- **Styling:** `src/app/globals.css` holds the palette tokens, base styles, the Tailwind v4
`@theme`/`@utility` classes and the scroll reveals. `src/app/web.css` is the whole desk: the
materials (slate chassis, cream plastic, paper, cork, black glass), the details (screws, LEDs,
pushpins, rack rails, barcode, torn receipt edge) and every object layout, all CSS with
`color-mix()` for tints and shades. `page.css` keeps the shared component styles the desktop
apps still use, and `skeuo.css` is the KDE desktop.
- **Fonts:** Nunito for hardware labels and headings, Newsreader for anything printed on paper,
IBM Plex Sans/Mono for body copy and terminal text — all via `next/font/google`. The desktop
keeps its system sans stack.
- **Assets:** the web theme ships **no images**. The desktop keeps its own wallpaper and icons.
- **Version:** `4.0.0` (see `package.json`)
- **Styling:** hand-written CSS — `src/app/page.css` (terminal theme), `src/app/skeuo.css`
(desktop + mobile), `src/app/globals.css` (base/reset). Tailwind v4 is imported for the
base layer but the UI is custom CSS.
- **Fonts:** Monocraft (self-hosted in `public/`, used by the terminal theme; the desktop
theme uses the system sans stack)
- **Images:** `next/image`
- **Version:** `2.1.0` (see `package.json`)
## 🚀 Running Locally
@ -179,35 +164,33 @@ they contend for `:3000` and `.next/dev/lock`.
```
src/app/
page.tsx → renders <ThemeRoot/>, imports the theme stylesheets
layout.tsx → html shell + metadata; loads the fonts; injects ThemeScript
globals.css → palette tokens, base, Tailwind @theme/@utility, scroll reveals
web.css → skeuomorphic material system + object layouts
page.css → shared component styles still used by the desktop apps
skeuo.css → KDE desktop styles
page.tsx → renders <ThemeRoot/>, imports the two theme stylesheets
layout.tsx → html shell + metadata, injects ThemeScript
globals.css → base/reset styles + Tailwind import
page.css → terminal theme styles
skeuo.css → desktop + mobile home styles
data.ts → socials, codingProjects, techProjects, friends, wallpapers
credits/page.tsx → credit page (type only — the desk ships no assets)
revival-inc/page.tsx → embeds the bundled game at /public/revival-inc/index.html
api/
heatmap/route.ts → contribution heatmap proxy
activities/route.ts → GitDXD activity feed proxy
frame/route.ts → header-stripping proxy for unframeable friend sites
ping/route.ts → service health check (HTTP + Minecraft)
components/
ThemeRoot.tsx → web desk vs. Desktop mode
ThemeScript.tsx → pre-paint script: device detection
ThemeRoot.tsx → picks which shell(s) to mount
ThemeScript.tsx → pre-paint script: theme + device detection
useTheme.ts → theme state via useSyncExternalStore
WebSite.tsx → the desk: rack hero, drawer, pegboard, patch panel
web-ui.tsx → rack units, LED dashboard, social masks, Reveal
TerminalLayout.tsx → the Gruvbox terminal shell
WindowsDesktop.tsx → desktop shell: icons, windows, taskbar, Start menu
MobileHome.tsx → phone shell: iOS home screen + app view
WinWindow.tsx → one draggable/resizable window
apps.tsx → APPS registry, window contents, in-app terminal
useDesktopIcons.ts → desktop icon grid + drag/drop logic
useDragOrder.ts → list reordering (used inside apps)
ServiceButton.tsx → desktop service link + live status dot
ContributionHeatmap.tsx → desktop heatmap + recent commits widget
useDragOrder.ts → list reordering (mobile grid/dock)
ServiceButton.tsx → service link + live status dot
ContributionHeatmap.tsx → heatmap + recent commits widget
Clock.tsx → live clock
JokerLogo.tsx → logo with click easter egg
SlBackground.tsx → animated ASCII train background
scripts/
dev-server.mjs → custom dev server: live updates without the dev-only debug surface
deploy/