diff --git a/README.md b/README.md index 18abd96..be88457 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ 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: -- **`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. +- **`web`** (default) — a light, frosted-glass **website**: a sticky full-height sidebar + (section nav, light/dark switch, desktop switch) beside a column of glass cards — hero with + a socials row, quick tiles, live services, activity heatmap, projects and hardware + (a masonry gallery), 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. diff --git a/agents.md b/agents.md index 97825bd..fd8fa1d 100644 --- a/agents.md +++ b/agents.md @@ -126,9 +126,16 @@ Themes: `web` = default frosted-glass website (sidebar + content, light/dark), ### Web theme + light/dark (v2.2.0 rework) - `WebLayout.tsx` is the default shell. Layout is a **sticky sidebar** (brand, section nav, light/dark switch, desktop switch, contact/clock) beside a single - content column of `.glass` panels (hero, quick tiles, services, activity, - projects, hardware, features, friends). The old stacked TUI panel layout and - the `SlBackground` ASCII train were removed with it. + content column of `.glass` panels: hero (with a compact "Find me" socials row), + a `.web-quick` 2-up (`now.txt` + `gym_sbd.db`), then services, activity, + projects, hardware, features (Revival/RustyWolf) and friends. Projects/hardware + use a CSS multi-column **masonry** gallery (`.project-grid`) so short cards + don't leave half-empty grid slots. The old stacked TUI panel layout and the + `SlBackground` ASCII train were removed with it. +- **Grid gotcha:** the mobile column is `minmax(0, 1fr)`, never bare `1fr`. A + `1fr` track has an automatic `min-content` floor, and with a wide child that + blew the single column out to ~2x the viewport (horizontal scroll + clipped + content on phones). Keep the `minmax(0, …)`. - Glassmorphism lives in one utility class, `.glass`, in `web.css`: a subtle `linear-gradient` over `--glass-hi`/`--glass-lo` with `backdrop-filter: blur(20px) saturate(165%)`. The page blobs behind the panels @@ -355,6 +362,11 @@ knows about icon ids, via `APP_BY_ID`. contain `data-theme="web"` / `data-scheme="light"` and the `.web-root` markup. Theme + scheme are read pre-paint from `localStorage.theme` / `.scheme`, so a quick check is to set those in devtools and reload. +- `next/image` is lazy by default, so a headless full-page screenshot shows the + below-the-fold feature shots and friend avatars as blank boxes. Scroll the page + slowly first and they load; this is a capture artifact, not a bug. Headless + Chromium lives at `~/.cache/ms-playwright/chromium-*/chrome-linux64/chrome` + (drive it with `--headless=new --remote-debugging-port=…` and CDP). - A dev server may already be running on port 3000 — on this host it is normally the **system** `dvorakmortonxd-dev` service, so check `systemctl status dvorakmortonxd-dev` first. Two dev servers on this repo diff --git a/src/app/components/WebLayout.tsx b/src/app/components/WebLayout.tsx index 4c1bd5f..7d113e4 100644 --- a/src/app/components/WebLayout.tsx +++ b/src/app/components/WebLayout.tsx @@ -243,9 +243,14 @@ export default function WebLayout() { Self-hosted services + +
+ Find me + +
-
+

now.txt

@@ -260,15 +265,7 @@ export default function WebLayout() {

gym_sbd.db

-
- -
-

socials.js

- -
- mail if u ever wanna contact me:{" "} - dvorak@dvorakmortonxd.dev -
+

Current squat / bench / deadlift PRs at ~73kg BW.

diff --git a/src/app/web.css b/src/app/web.css index 3265a51..d701661 100644 --- a/src/app/web.css +++ b/src/app/web.css @@ -34,22 +34,23 @@ :root { --web-accent: #6d5efc; --web-accent-2: #2f8bff; - --web-page: #eef1f9; + --web-page: #e9edfb; --web-ink: #10182b; --web-muted: #5b6785; - --glass-hi: rgba(255, 255, 255, 0.72); - --glass-lo: rgba(255, 255, 255, 0.4); - --glass-border: rgba(255, 255, 255, 0.85); - --glass-inset: rgba(255, 255, 255, 0.95); - --glass-shadow: 0 22px 48px -26px rgba(23, 32, 60, 0.45); - --hover: rgba(109, 94, 252, 0.1); + --glass-hi: rgba(255, 255, 255, 0.58); + --glass-lo: rgba(255, 255, 255, 0.22); + --glass-border: rgba(255, 255, 255, 0.72); + --glass-inset: rgba(255, 255, 255, 0.9); + --glass-shadow: 0 26px 55px -30px rgba(23, 32, 60, 0.55); + --hover: rgba(109, 94, 252, 0.12); --accent-soft: rgba(109, 94, 252, 0.35); --accent-line: rgba(109, 94, 252, 0.5); - --blob-a: rgba(109, 94, 252, 0.3); - --blob-b: rgba(47, 139, 255, 0.26); - --blob-c: rgba(236, 72, 153, 0.16); + --blob-a: rgba(109, 94, 252, 0.45); + --blob-b: rgba(47, 139, 255, 0.38); + --blob-c: rgba(236, 72, 153, 0.28); + --blob-d: rgba(45, 212, 191, 0.26); /* Tokens shared with ServiceButton / ContributionHeatmap */ --fg: var(--web-ink); @@ -92,6 +93,7 @@ html[data-theme="web"][data-scheme="dark"] { --blob-a: rgba(109, 94, 252, 0.34); --blob-b: rgba(47, 139, 255, 0.26); --blob-c: rgba(236, 72, 153, 0.18); + --blob-d: rgba(45, 212, 191, 0.16); --bg-hard: rgba(255, 255, 255, 0.08); --green: #34d399; @@ -125,9 +127,10 @@ html[data-theme="web"] body { z-index: 0; pointer-events: none; background: - radial-gradient(58rem 40rem at 6% -12%, var(--blob-a), transparent 62%), - radial-gradient(52rem 38rem at 102% -4%, var(--blob-b), transparent 58%), - radial-gradient(46rem 36rem at 58% 118%, var(--blob-c), transparent 60%), + radial-gradient(54rem 40rem at 6% -6%, var(--blob-a), transparent 60%), + radial-gradient(52rem 38rem at 100% 4%, var(--blob-b), transparent 58%), + radial-gradient(46rem 42rem at 82% 88%, var(--blob-c), transparent 60%), + radial-gradient(44rem 40rem at 14% 94%, var(--blob-d), transparent 62%), var(--web-page); } @@ -141,7 +144,7 @@ html[data-theme="web"] body { width: 100%; max-width: 1320px; margin: 0 auto; - padding: 26px clamp(16px, 3vw, 34px) 72px; + padding: 22px clamp(16px, 3vw, 34px) 44px; align-items: start; } @@ -160,8 +163,8 @@ html[data-theme="web"] body { border: 1px solid var(--glass-border); border-radius: 22px; box-shadow: var(--glass-shadow), inset 0 1px 0 var(--glass-inset); - -webkit-backdrop-filter: blur(20px) saturate(165%); - backdrop-filter: blur(20px) saturate(165%); + -webkit-backdrop-filter: blur(28px) saturate(180%); + backdrop-filter: blur(28px) saturate(180%); } /* ============================================================ @@ -169,10 +172,14 @@ html[data-theme="web"] body { ============================================================ */ .web-sidebar { position: sticky; - top: 26px; + top: 22px; display: flex; flex-direction: column; gap: 18px; + height: calc(100vh - 44px); + height: calc(100dvh - 44px); + overflow-y: auto; + overscroll-behavior: contain; padding: 20px; } @@ -365,7 +372,7 @@ html[data-theme="web"] body { align-items: center; padding: 10px 18px; border-radius: 999px; - background: linear-gradient(120deg, var(--accent), var(--accent-2)); + background: linear-gradient(120deg, var(--accent), var(--accent2)); color: #ffffff; font-size: 0.84rem; font-weight: 650; @@ -391,17 +398,17 @@ html[data-theme="web"] body { /* ============================================================ QUICK TILES ============================================================ */ -.web-tiles { +.web-quick { display: grid; - grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + grid-template-columns: 1.5fr 1fr; gap: 20px; align-items: stretch; } .web-tile { display: flex; flex-direction: column; - gap: 12px; - padding: 20px; + gap: 14px; + padding: 22px; } .web-tile-title { font-size: 0.7rem; @@ -411,9 +418,28 @@ html[data-theme="web"] body { color: var(--accent); } .web-tile-text { - font-size: 0.87rem; + font-size: 0.9rem; color: var(--web-muted); } +.web-tile-note { + margin-top: auto; + font-size: 0.74rem; + color: var(--web-muted); + opacity: 0.85; +} + +/* Compact socials row inside the hero. */ +.web-social-strip { + display: flex; + flex-direction: column; + gap: 12px; + margin-top: 26px; + padding-top: 20px; + border-top: 1px solid var(--glass-border); +} +.web-social-strip .social-buttons { + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); +} /* ============================================================ SECTIONS @@ -613,12 +639,16 @@ html[data-theme="web"][data-scheme="dark"] .friend-icon { PROJECTS / HARDWARE ============================================================ */ .project-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); - gap: 16px; + /* Masonry-ish gallery: multi-column packs the cards tightly, so a short card + never leaves a half-empty slot under a tall neighbour. */ + columns: 3 250px; + column-gap: 14px; } .project-card { display: block; + break-inside: avoid; + -webkit-column-break-inside: avoid; + margin-bottom: 14px; padding: 12px; border-radius: 16px; border: 1px solid var(--glass-border); @@ -635,7 +665,7 @@ html[data-theme="web"][data-scheme="dark"] .friend-icon { box-shadow: 0 20px 38px -20px rgba(23, 32, 60, 0.55); } .project-image { - height: 158px; + height: 150px; width: 100%; margin-bottom: 12px; border-radius: 12px; @@ -1034,13 +1064,15 @@ html[data-theme="web"][data-scheme="dark"] .heatmap-legend-cell[data-level="4"] ============================================================ */ @media (max-width: 960px) { .web-root { - grid-template-columns: 1fr; + grid-template-columns: minmax(0, 1fr); gap: 18px; padding: 18px 14px 56px; } .web-sidebar { position: static; gap: 14px; + height: auto; + overflow: visible; padding: 16px; border-radius: 20px; } @@ -1079,15 +1111,18 @@ html[data-theme="web"][data-scheme="dark"] .heatmap-legend-cell[data-level="4"] } } +@media (max-width: 820px) { + .web-quick { + grid-template-columns: 1fr; + } +} + @media (max-width: 640px) { .web-title { font-size: 1.7rem; } - .web-tiles { - grid-template-columns: 1fr; - } .project-grid { - grid-template-columns: 1fr; + columns: 1; } .services-buttons, .services-buttons.services-main {