rename terminal theme to web, make it the default, drop the mobile home screen, and rebuild the web shell as a light/dark glassmorphism layout

This commit is contained in:
Martin Dvořák 2026-09-30 11:09:57 +00:00
commit d947ecfb1a
21 changed files with 1707 additions and 2978 deletions

View file

@ -2,27 +2,35 @@
> The source code for my personal website, **[dvorakmortonxd.dev](https://dvorakmortonxd.dev)**.
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:
This is not a normal portfolio page. It ships **two shells** and picks which one to show
from the saved theme, all from the same content:
- **`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.
- **`web`** (default) — a light, frosted-glass **website**: a sticky sidebar (section nav,
light/dark switch, desktop switch) beside a column of glass cards — hero, quick tiles,
live services, activity heatmap, projects, hardware, features and friends. Light by
default with a persisted dark mode, and fully responsive, so phones and desktops get the
same shell.
- **`skeuo`** — an alternate KDE Plasma / Windows-style **desktop simulation** (desktop
only): draggable snap-to-grid icons, resizable/floating windows, a Start menu, taskbar and
live clock. Reachable from the web theme's sidebar switch.
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**, a gym SBD panel and links to friends' sites.
heatmap**, a gym SBD panel and links to friends' sites. The desktop shell additionally embeds
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.
## ✨ Features
- **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.
- **Two themes / shells** — a default frosted-glass **web** shell and an alternate KDE-style
**desktop** shell, toggled from either UI and persisted in `localStorage` (applied pre-paint
to avoid a flash). Phones always get the web shell.
- **Light / dark mode** — the web shell has a light/dark switch (light by default, remembered
in `localStorage`, applied pre-paint). The desktop shell keeps its own Breeze Dark look.
- **Glassmorphic web layout** — a sticky sidebar with section navigation beside a column of
frosted-glass panels (subtle gradients + `backdrop-filter` blur), reorganised into
hero / quick-tile / section cards.
- **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.
@ -58,13 +66,13 @@ heatmap**, a gym SBD panel and links to friends' sites.
- **Framework:** Next.js 16 (App Router, Turbopack)
- **Language:** TypeScript, React 19 (client components everywhere interactivity lives)
- **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)
- **Styling:** hand-written CSS — `src/app/web.css` (web theme: frosted glass + light/dark),
`src/app/skeuo.css` (desktop theme), `src/app/globals.css` (base/reset). Tailwind v4 is
imported for the base layer but the UI is custom CSS.
- **Fonts:** the web theme uses the system sans stack; Monocraft (self-hosted in `public/`) is
used by the desktop theme's SMP menu and the in-desktop terminal.
- **Images:** `next/image`
- **Version:** `2.1.0` (see `package.json`)
- **Version:** `2.2.0` (see `package.json`)
## 🚀 Running Locally
@ -167,8 +175,8 @@ src/app/
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
web.css → web theme styles (frosted glass, light + dark)
skeuo.css → desktop theme styles (KDE/Plasma shell)
data.ts → socials, codingProjects, techProjects, friends, wallpapers
revival-inc/page.tsx → embeds the bundled game at /public/revival-inc/index.html
api/
@ -176,21 +184,19 @@ src/app/
activities/route.ts → GitDXD activity feed proxy
ping/route.ts → service health check (HTTP + Minecraft)
components/
ThemeRoot.tsx → picks which shell(s) to mount
ThemeScript.tsx → pre-paint script: theme + device detection
ThemeRoot.tsx → picks which shell to mount (web or desktop)
ThemeScript.tsx → pre-paint script: theme + light/dark scheme
useTheme.ts → theme state via useSyncExternalStore
TerminalLayout.tsx → the Gruvbox terminal shell
useColorScheme.ts → light/dark state via useSyncExternalStore
WebLayout.tsx → default web shell: sidebar + glass content
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 (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/